HDU1042 - N! (大數運算)

題目鏈接

思路

求 N 的階乘,階乘大家都會,這道題考的就是大數,因爲 N 的取值達到了10000,那麼他的結果的位數就已經達到了上萬了。

所以就是模擬大數乘法,因爲階乘時,一個數很大,另一個數是相對較小的,所以思路是比較簡單的。

具體的思路就是,以前計算乘法時是用一個數的每一位去乘另一個數,然後按照一定的規則進行相加。現在我們直接用小數去乘大數的每一位,進位的時候不再侷限是個位數,而是直接進位除 10 後的結果。

這樣的話,如果只進行 大數的位數次 乘法運算的話,第一位的數字經過累積就會非常大,所以每次計算時完成後,要將首位向前分解。

細節見代碼……

代碼

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
int num[50000];

int main()
{
    int n, temp, len = 0;
    int i, j, up;

    while(scanf("%d", &n)!=EOF)
    {
        if(n==0)
        {
            // 0 的階乘爲 1,wa了好長時間,數學渣
            printf("1\n");
            continue;
        }

        memset(num, 0, sizeof(num));
        num[0] = 1;
        len = 0;
        for(i=2; i<=n; i++)
        {
            for(j=0, up=0; j<=len; j++)
            {
                temp = num[j] * i + up;
                num[j] = temp%10;
                up = temp/10;
            }
            // 向前分解,直到首位爲個位數
            for(; ; j++)
            {
                if(up==0)
                {
                    len = j-1;
                    break;
                }
                num[j] = up%10;
                up /= 10;
            }
        }
        for(i=len; i>=0; i--) printf("%d", num[i]);
        printf("\n");
    }

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