大数阶乘
时间限制: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(""); } }
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。