大数阶乘
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入一个整数m(0<m<=5000)
-
输出m的阶乘,并在输出结束之后输入一个换行符
输入输出样例输入50样例输出30414093201713378043612608166064768844377641568960512000000000000#include<stdio.h> #include<string.h> int a[3270];//其实我先开的很大,后来通过a[0]的值判断,然后改的小了,尽量占得空间少一点 int main() { int n; while(~scanf("%d",&n)) { a[1]=1; //初始化 a[0]=1; //用于储存数组进到几位,为后面的输出带来极大便利 int up; for(int i=2; i<=n; ++i) { up=0;//判断数组是否进位 for(int j=1; j<=a[0]; ++j) //各个位相乘 { a[j] *=i; a[j] +=up; up=a[j]/100000;//可以将其看成100000进制,不用开很大的数组,效率上也得到了很大提升 a[j] %=100000;//这个比十进制要好 } if(up!=0)//判断是否进位 { a[0]++; a[a[0]]=up;//从这可以看出a[0]是储存数组位数 } } if(a[0]==1) printf("%d",a[1]);//如果没超出5位数 直接输出a[1] else { printf("%d",a[a[0]]);//防止前导0,因为要从后往前输出,每个需要输出5位,最高位不需要有0 for(int i=a[0]-1; i>0; i--) printf("%05d",a[i]);//这个需要输出0 } puts(""); } }
-
描述