大數階乘
- 描述
- 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
- 輸入
- 輸入一個整數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]; } } }