1. 程式人生 > >NYOJ.28.大數階乘

NYOJ.28.大數階乘

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的位數