原題地址:http://acm.hdu.edu.cn/showproblem.php?pid=1042
首先定義一個足夠長的數組。
拿10000的階乘爲例,最後的結果長度是35660位,所以我們定義一個40000個成員的數組就可以了。
int result[40000];
其核心思想就是把計算結果每一位上的數字保存到一個數組成員中,例如:
把124保存至數組中,保存結果應該是
result[0] 4
result[1] 2
result[2] 1
這樣肯定是沒有問題的,一個int型數據存放一個小於10的數是絕對不會溢出。但是處理起來就稍微有點麻煩。
把整個數組看成一個數字,這個數字和一個數相乘的時候,需要每一位都和這個乘數進行相乘運算還需要把前一位的進位加上。運算方法和小學數學乘法一樣,乘積的個位是當前位上應該表示的數字,10位以上的需要進位。因爲乘數不可能大於10000,所以乘數和一個小於10的書相乘的時候不會大於100000,再加上前一位的進位用一個int型數據來保持這個結果就沒有問題。寫法如下:
int 結果 = result[x] * 乘數 + 進位;
每一位的計算結果有了,把這個結果的個位數拿出來放到這個數組元素上:
result[x] = 結果%10;
接下來的工作就是計算出進位:
進位 = 結果 / 10;
這樣一位一位的把整個數組計算一遍,最後可能還有進位,用同樣的方法,把進位的數值拆成單個數字,放到相應的數組元素中。
#include <iostream>
using namespace std;
int main()
{
int carry,n,j;
int a[40001];
int digit;
int temp,i;
while(cin>>n){
a[0]=1;
digit=1;
for(i=2; i<=n; i++){
for(carry=0,j=1; j<=digit; ++j){
temp=a[j-1]*i+carry;
a[j-1]=temp%10;
carry=temp/10;
}
while(carry){
a[++digit-1]=carry%10;
carry/=10;
}
}
for(int k=digit; k>=1; --k)
cout<<a[k-1];
cout<<endl;
}
return 0;
}