//大数阶乘
// 07.4.27
#include<stdio.h>
#include<time.h>
int main()
{
double duration;
int a[100000]={0};
int N,i,c=1,j;
a[1]=1;
clock_t start, finish;
printf("大数阶乘,请输入一个数\n");
scanf("%d",&N);
start = clock();
for (j=1;j<=N;j++)
{
for (i=1;i<=c;i++)
{
a[i]=a[i]*j;
}
for (i=1;i<=c;i++)
{
/*不能写成(i=c;i>0;i--)因为这样将漏掉低位的进位,
例如a[3]=7*7,a[2]=3*3,a[1]=2*5,当i减到1时a[1]=10需要向a[2]进一位,而当仅为后
a[2]=10又该向a[3]进位,但此时循环已是最后一次循环,故不能实现向a[3]进位
a[4]=4 a[3]=9 a[2]=10 a[1]=0
*/
if (a[i]>=10)
{
a[i+1]=a[i+1]+a[i]/10;
a[i]=a[i]%10;
if(a[c+1]!=0)
c++;
}
}
//若将if(a[c+1]!=0)语句放于此处(for (i=1;i<=c;i++))之外则造成a[c+1]不是一位数,
//因为a[c+1]这个元素将不止一位数,当进行例如1000!的计算时
//会由于a[c+1]数值的溢出而造成计算不准确。
}
printf("result:\n");
for(i=c;i>0;i--)
{
printf("%d",a[i]);
}
finish = clock();
printf("\n一共%d位\n",c);
duration = (double)(finish - start)/CLOCKS_PER_SEC ;
printf( "%f ms\n", duration );
getchar();
getchar();
return 0;
}
评论