杭電ACM 1042 大數階乘 N!

原題地址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;
}


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