//大数阶乘// 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;}

评论