階乘會使得位數增加的很是快,好比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