大数阶乘
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
-
-
输入
-
输入一个整数m(0<m<=5000)
-
样例输入
-
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(""); } }
-