大数阶乘
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000
来源
解题思路:
1、每次乘完就立即保存在数组中,对10取余后保存,对10取整向前进位。
#include<stdio.h>
#include<string.h>
#define N 100000
int main()
{
int a[N],n,m,i,j,k,t,r;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
a[0]=1;
r=1; // 保存的数组长度初始值为 1;
for(j=2;j<=n;j++)
{
k=0;
for(i=0;i<=r;i++) // 每一位分别乘以需要乘的数
{
t=a[i]*j+k; // a[i],可能为0.所以结果不会多乘的。
a[i]=t%10;
k=t/10;
if(i==r&&k!=0)//判断是否溢出 ,溢出则把长度加一。以便下次循环相乘
r++;
}
}
for(i=r;j>=0;i--) //判断结果的最高位是否为0 。为零则删除。
if(a[i])
break;
for(j=i;j>=0;j--) // 输出结果,注意 是 j=i;i是判断后的结果;
printf("%d",a[j]);
printf(" ");
}
return 0;
}