#include<stdio.h>
int main(void)
{ int n;
while(scanf("%d",&n)!=EOF)
{
long a[8916]={1,0},i,c,len;
for ( len=1;n>1; n--)
{
for (c=0,i=0; i<len;i++ )
{
a[i]= ( c+= a[i]*n ) % 10000; c/=10000;
}
((a[i]=c)>0)?len++:0;
}
for( len--,printf("%d",a[len--]);len>=0; len--) printf("%04d",a[len]);printf("\n");
} return 0;
}
大概能计算到10555左右的阶乘。
而在算法书上的解法是用字符串,进位+1,相乘,模拟了竖式计算。
这个方法很巧妙的利用了余数,因为是求1W以内的阶乘,所谓每个数都可以取1W的余数,用数组寄存四位数。最后拼接。
【解释】
for ( len=1;n>1; n--) //把len的长度初始为1,因为数组中已经有一个元素了a[0]=1
{
for (c=0,i=0; i<len;i++ ) //c初始为0,一开始还没运算哪来的进位,这是个内层循环,数组a中的len
//个元素都必须参与运算,都必须*n,这就是下面a[i]*n的来由
{
a[i]= ( c+= a[i]*n ) % 10; c/=10; //c是进位,不用说了,c+=a[i]*n,a每个元素与n
//相乘必须考虑低位是否有进位,有就加起来
}
((a[i]=c)>0)?len++:0; //最后一个元素也有进位吗,有的话就在当前的元素的下个数组位置直接等于进位值,并
// 且数组的元素值 要加1,没有的话什么都不干 ,光一个0什么都不是
}
****法二,可用做模版
void BigFactorial(int m)
{
static int a[50000]={0,1};//第一位不用
int i,j,carry,tmp,lenth=1;//carry表示进位
for (i=2;i<=m;i++)
{
carry=0;
for (j=1;j<=lenth;j++)
{
//乘法转化为加法和进位
tmp=a[j]*i+carry;
a[j]=tmp%10;
carry=tmp/10;
//如果有进位,则向前扩展一位
if (j==lenth&&carry!=0)
lenth++;
}
}
for(int k=lenth;k>=1;k--)
printf("%d",a[k]);
}