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

nyoj 大數階乘 28

#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("");
    }
}