数的阶乘增长非常快速,传统的数据无法满足计算需求,需要用一个数组存放数据。
#include <stdio.h>
#define lim 10
int n1[1000];
int top;
void cout();
long m1,m2;
void multiply(int t)
{
int i=0,j=0,k;
while(1)
{
n1[i]*=t;
n1[i]=n1[i]+j;
if(n1[i]>=lim)
{j=n1[i]/10;n1[i]=n1[i]%10;}
else
{
j=0;
}
i++;
if(i>top)
break;
}
while(j!=0)
{
n1[i++]=j%10;
j=j/10;
}
top=i-1;
}
void final()
{
int i,t;
t=0;
for(i=0;i<=top;i++)
{
n1[i]+=t;
if(n1[i]>10)
{
t=n1[i]/10;
n1[i]=n1[i]%10;
}
else
t=0;
}
while(t!=0)
{
n1[i++]=t%10;
t=t/10;
}
top=i-1;
}
void cout()
{
int i=0;
printf("result:/ttop:%d/t",top);
for(i=top;i>=0;i--)
{
printf("%d",n1[i]);
}
for(i=0;i<=top;i++)
{
m2=m2*10+n1[i];
}
printf("/n");
}
void factorial(int t)
{
int i,j,k,m;
printf("factorial:%d/n",t);
k=0;
m=t;
while(1)
{
i=t%10;
n1[k]=i;
if(t=t/10)
k++;
else
break;
}
top=k;
for(i=m-1;i>=2;i--)
multiply(i);
final();
cout();
}
int main()
{
factorial(400);
getch();
return 0;
}
1000位的数组可以实现400的阶层,有868位
如果不惜空间而吝惜时间,那么lim可以设置的大一点,可以减少运算次数