[藍橋杯][基礎訓練]階乘計算(不理解你錘我)

問題描述

Description
輸入一個正整數n,輸出n!的值。
其中n!=123*…*n。
Input
輸入包含一個正整數n,n≤1000。
Output
輸出n!的準確值。
Sample Input
10
Sample Output
3628800
More Info
n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。
使用一個數組A來表示一個大整數a,A[0]表示a的個位,A[1]表示a的十位,依次類推。
將a乘以一個整數k變爲將數組A的每一個元素都乘以k,請注意處理相應的進位。首先將a設爲1,然後乘2,乘3,當乘到n時,即得到了n!的值。

問題解法

使用一個數組存一個數字的方法,極爲繁瑣,接下來的方法,一定能夠讓你理解的。
我們使用數組的一個地方來存4爲數字,相對10進制來說,這是10000進制,即上一數字滿10000,下一個數字加一,題目中最大的n爲1000,這意味這,當前位置乘完之後,最多向下一位進位,不可能向下下一位進位。於是有了下面的代碼。

完整代碼

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

int main()
{
    int data[10005];
    int temp[10005];
    int n,r,t1,tail;
    memset(data,0,sizeof(data));
    cin >> n;
    if(n <= 1) return 1;
    int head = 0;
    data[0] = 1;
    for (int i = 1; i <= n; i++) {
        t1 = 0;
        for (int j = 0; j <= head; j++) {
            // !!! 模擬手工計算 當前位相乘後加上進位數
            r = data[j] * i + t1;
            if(r >= 10000){
                // !!! 計算出進位數字
                t1 = r / 10000;
                data[j] = r % 10000;
                // !!! 最大位+1
                if(j == head) head++;
            }else{
                data[j] = r;
                t1 = 0;
            }
        }
    }
    printf("%d",data[head]);
    for (int i = head - 1; i >= 0; i--) {
        // !!! %04d 是打印4位,不足的用零來填充
        printf("%04d",data[i]);
    }
    cout << endl;
    return 0;
}

參考鏈接

https://www.jianshu.com/p/25b49190305e

發佈了46 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章