NYOJ.28.大數階乘
阿新 • • 發佈:2019-01-26
28.大數階乘
時間限制:3000 ms | 記憶體限制:65535 KB難度:3
描述
我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
輸入
輸入一個整數m(0<m<=5000)
輸出
輸出m的階乘,並在輸出結束之後輸入一個換行符
樣例輸入
50樣例輸出
30414093201713378043612608166064768844377641568960512000000000000
#include <stdio.h> #define E 100000 //大數與小數乘法,digit代表位數 void mul(int m[],int n,int &digit){ int i,r=0;//r記錄進位,個位無進位,故初始化為0 for(i=0;i<digit;i++){ r+=m[i]*n; m[i]=r%E; r/=E; } while(r){//判斷相乘後大數長度是否有所增加並進行相關操作 m[digit++]=r%E; r/=E; } } int main(){ int f[3300],d,i,n; while(~scanf("%d",&n)){ for(i=2,d=f[0]=1;i<=n;i++) mul(f,i,d); printf("%d",f[--d]);//首先輸出大數最高位,因為最高位不需要補0 while(d--) printf("%05d",f[d]);//一個數組元素儲存5位數字,故輸出的時候要顧及到0的位數 printf("\n"); } return 0; }
使用了int型陣列進行大數的儲存,一個數組元素儲存5位數字,故輸出的時候要顧及到0的位數