大数阶乘
-
描述
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
#include<stdio.h>
#include <string.h>#define MAX 20000//20000 的由来在下面
int main()
{
int T,s[MAX],n,i,j;
int sum,t;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(s,0,sizeof(s));
s[0]=1;
for(i=2;i<=n;i++)
{
t=0;
for(j=0;j<MAX;j++)
{
sum=s[j]*i+t;//计算的和
s[j]=sum%10;//每次取余数放在最低位
t=sum/10; //保存进位的数
}
}
for(i=MAX-1;i>=0;i--)
{
if(s[i])break;//进行清零操作
}
for(j=i;j>=0;j--)
{
printf("%d",s[j]); //记录最后一个不为0的下标后倒序输出结果
}
printf("\n");
}
return 0;
}
大数阶乘的结果太大了,一个几千万的数要去求阶乘就要乘以几千次并且数据非常大为了解决这样的问题我们就使用数组来解决,一个数放一个单元最后倒序输出就可以了。
在开辟数组大小的时候我们必须要知道最后的结果是多少位数把,以防止数据太大溢出
那么位数怎么求得的呢?
eg:123是个三位数把,求位数的方法就是(int)(log10(123)+1);
所以下面有一个这样的简单程序去求得位数:
#include <stdio.h>
#include<math.h>
int main()
{
int N,n;
double sum;
int i;
scanf("%d",&N);
while(N--)
{
sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=log10((double)i);
}
printf("%d\n",(int)sum+1);
}
return 0;
}
加油啊~
还有一个代码是朋友写的
#include<stdio.h>
int main()
{
int m,a[20000],i,j,x,b,c;
scanf("%d",&m);
a[0]=1;//第一位一定要放1!!!
x=2;
b=1; //表示当前有多少位数
c=0; //进位
while(x<=m)
{
for(i=0;i<b;i++)
{
a[i]=a[i]*x+c;
c=a[i]/10;
a[i]=a[i]%10;
}
while(c>0)
{
a[i]=c%10;
i++;
c=c/10;
}
b=i;
x++;
}
for(i=b-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
return 0;
}