大数阶乘
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
- 描述
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
- 输入
- 输入一个整数m(0<m<=5000)
- 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符
- 样例输入
-
50
- 样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
大数大树傻傻分不清楚。。。
学长说要做做大数~那就做好啦,先从之前做过的下手,小小的复习一下下~
贴代码
#include <stdio.h> #include <stdlib.h> #define MAX 20000 int num[MAX]; int main() { int n; scanf("%d",&n); num[0] = 1; int i,j; for(i=1; i<=n; i++) //最外层循环,从1乘到n { for(j=0; j<MAX; j++) //num[0]存的是数字的最后一位,例如24则数组中存的是4,2 { num[j] *= i; //从最后一位,也就是相当于数的个位开始乘 } for(j=0; j<MAX; j++) { if(num[j] >= 10) //从个位开始判断是否有数字大于10,大于10就向数组的下一个即i+1进位 { num[j+1] += num[j]/10; num[j] %= 10; } } } for(i=j-1; i>=0; i--) //数组从后往前找到不是0的数的下标i { if(num[i] != 0) break; } for(j=i; j>=0; j--){ //从i开始输出数组,也就是最后大数的阶乘 printf("%d",num[j]); } printf("\n"); return 0; }
最优代码#include<iostream> #include<iomanip> using namespace std; //存储20000以内的阶乘 int a[15470]; int main() { //freopen("1.txt","r",stdin); //freopen("2.txt","w",stdout); int n; cin>>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; a[j] %=100000; } if(up!=0) { a[0]++; a[a[0]]=up; } } if(a[0]==1) cout<<a[1]; else { cout<<a[a[0]]; for (int i=a[0]-1;i>0;i--) { cout<<setfill('0')<<setw(5)<<a[i]; } } }