Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
1 2 3
1 2 6
大数阶乘,这一道题特别难受人。
首先是思路,然后是细节,这里我就介绍一下。
思路是模拟乘法的方式,进行算法运算。因为10000的阶乘是34000多位,在这里可以开一个40000的数组,再
开两个for循环,第一个是控制每一个数相乘,第二个控制大数每一位数与第一个for循环中的数相乘。
并且每次取余这样就不会爆了。
细节吗??????
自己多注意
int n,s,i,j,l; //s是余数。 int a[40000]; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); a[0]=1; int d=0; for(i=2; i<=n; i++) //控制每次相乘的那个数。 { s=0; //余数刚开始变成0 for(j=0; j<=d; j++) //这里代码非常简化,完全不会怕超时。d的个数没次都增加1 { l=a[j]*i+s; a[j]=l%10; s=l/10; } while(s) //这里是观察每次超出了多少位,然后再使用空余的数组空间 { a[++d]=s%10; s=s/10; } } for(int j=d; j>=0; j--) //这里从d开始就不说了,自己理解。 printf("%d",a[j]); printf("\n"); }