【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《大数的阶乘(求末尾有几个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;
}









