大數運算之大數階乘

階乘會使得位數增加的很是快,好比20!的值的位數就已經要突破long long的上限了。因此常規的作法是處理不了的,要經過數組的方式來處理。固然這個數字自己不能超過int的範圍,而且要提早預估這個數字的階乘會有多少位。c++

以計算5的階乘爲例,來講明這個算法:git

STEP1
初始化array[0] = 1算法

STEP2
從2開始乘,1*2 = 2,結果只有1位數,直接存到array[0]數組

STEP3
2*3 = 6,結果只有1位數,直接存到array[0]spa

STEP4
6*4 = 24,結果有2位數,2存到array[1],4存到array[0]code

STEP5
24*4 = 120,結果有3位數,1存到array[2],2存到array[1],0存到array[0]ci

代碼實現:it

#include<bits/stdc++.h>
using namespace std;
#define MAXLENGTH 50000
int main()
{
    int n;
    while(cin >> n)
    {
        int* array = NULL;
        array = (int*)malloc(MAXLENGTH*sizeof(int));
        if(!array)
        {
            cout << "malloc failed" << endl;
            break;  
        } 
        else
        {
            array[0] = 1;
            int digit = 1;//位數,隨着計算不斷更新 
            for(int i = 2;i <= n;i++)
            {
                int temp;
                int carry = 0;//進位 
                for(int j = 0;j < digit;j++)//將一個數每一位都乘以i 
                {
                    temp = array[j]*i+carry;
                    array[j] = temp%10;//將一個數的每一位拆開存放到數組的每一位 
                    carry = temp/10;
                }
                while(carry)
                {
                    array[digit] = carry%10;
                    carry /= 10;
                    digit++;
                }
            }
            while(digit >= 1) cout << array[--digit];//逆序輸出 
            cout << endl;
        }
        free(array);
    }
    return 0;
}

以上的代碼計算10000的階乘沒有問題di

相關文章
相關標籤/搜索