大数的阶乘(求末尾有几个0)

2022-10-11 14:35:18   文档大全网     [ 字体: ] [ 阅读: ]

#文档大全网# 导语】以下是®文档大全网的小编为您整理的《大数的阶乘(求末尾有几个0)》,欢迎阅读!
阶乘,大数,末尾

#include<iostream>

#include<string.h>

using namespace std;

char *multi(char *p, char *q);//大乘法

char *convert(int n);//将整形转换成字符串

void main()

{

int num, i;

cout<<"input a number:";

cin>>num;

//cout<<convert(num)<<endl;

char ch[10000] = "1";

for(i = 2; i <= num; i++)

{

strcpy(ch, multi(ch, convert(i)));//乘出后的结果赋给ch数组

}

int totalNum = 0;

//从后往前搜索,出现ch[i] != '0'的时候跳出循环

for(i = strlen(ch) - 1; i >= 0; i--)

{

if(ch[i] != '0')

break;

totalNum++;

}

cout<<totalNum<<endl;

}

char *multi(char *p, char *q)

{

char *min, *max;//max存放长度长的字符串,min存放长度短的字符串

int a[10000] = {0}, i, j;

if(strlen(p) > strlen(q))

{

min = q;

max = p;

}

else

{

min = p;

max = q;

}

int len = strlen(max);

for(i = strlen(min) - 1; i >= 0; i--)//乘法----是长的字符串依次乘以短的字符串

{

for(j = 0; j < strlen(max); j++)

{

a[j] += (min[i] - '0') * (max[j] - '0');//将乘出来的结果保存在整形数组a中

}

if(i > 0)//当短的字符串没有遍历完时,数据要向后移动一位,仔细想想乘法口诀表,很好理解的(个位数成完后,十位数写在个位数前面)

{

for(j = len - 1; j >= 0; j--)

a[j + 1] = a[j];

a[0] = 0;

len++;

}

}

//求出结果后。满10向前进一位

for(i = len - 1; i > 0; i--)

{

a[i - 1] += a[i] /10;

a[i] %= 10;

}

if(a[0] > 10)//当第一位数大于10的时候说明位数不够

{

int temp = a[0];

a[0] = temp % 10;

temp /= 10;

while(temp)//将位数补齐

{

for(i = len - 1; i >= 0; i--)

{

a[i + 1] = a[i];

}

a[0] = temp % 10;

temp /= 10;

len++;

}

}

//将整形数组转换乘字符数组

char *c = new char[10000];

for(i = 0; i < len; i++)

{

c[i] = a[i] + '0';

}

c[i] = '\0';

return c;

}

char *convert(int n)//这个就不用解释了吧...

{

char *c = new char[10000];

int len = 0;

while(n)

{

c[len++] = n % 10 + '0';

n /= 10;

}

c[len] = '\0';

int i = 0, j = len - 1;

for(;i < j; i++, j--)

{

char temp = c[i];

c[i] = c[j];

c[j] = temp;

}

return c;

}

本文来源:https://www.wddqxz.cn/527f947b5acfa1c7aa00cc33.html

相关推荐