【清華機試】N!(0

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 3002;     // 1000 的階乘約 2600 位

int a[maxn] = {0};         // 存儲 N 的階乘

char num[1002][maxn] = {0}; // 存儲每一個 N!

int main()
{
    int i = 2;      // 遍歷2-n
    int j = 1;
    int len = 1;    // 數組長度,默認爲1
    int count = 0;  // 計數器

    // 求解 1!~1000!, 空間換時間
    a[1] = 1;
    for(i = 2; i <= 1000; ++i)
    {
        // 每一位乘以i
        for(j = 1; j <= len; ++j)
        {
            a[j] *= i;
        }
        // 移位
        for(j = 1; j <= len; ++j)
        {
            if(a[j] > 9)
            {
                a[j+1] += a[j]/10;
                a[j] %= 10;
                // 處理高位進位
                if(len == j)
                {
                    len++;
                }
            }
        }
        // 不用過濾前面的0, len就指向的最高位
        count = 0;
        for(j = len; j >= 1; --j)
        {
            num[i][count++] = '0'+a[j];
        }
        num[i][count] = '\0';   // 存儲結尾的'\0'
    }

    int n;
    while(cin >> n)
    {
        if(n == 0)
        {
            // 0!
            cout << "1" << endl;
        }
        else
        {
            printf("%s\n", num[n]);
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章