大數階乘(nyoj28)

大數階乘
時間限制:3000 ms  |  內存限制:65535 KB
難度:3
描述
我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
輸入
輸入一個整數m(0<m<=5000)
輸出
輸出m的階乘,並在輸出結束之後輸入一個換行符
樣例輸入
50
樣例輸出
30414093201713378043612608166064768844377641568960512000000000000

解題思路:

1.大數問題,關鍵是處理好進位和當前最低位的關係。需要設一個變量(初始值 爲0)來保存進位值。

2.每次相乘得到的結果加進位變量,等於臨時值,通過臨時值%得當前最低位,臨時值/10得進位值。

3.這樣乘得的結果是倒序的,因此需要倒序輸出,還應注意前導0的問題,從數組最後開始,跳過前導0,直到第一個不爲0的數字開始輸出。

代碼:

#include <stdio.h>
#include <string.h>
#define MAX 16325

int main()
{
	int result[MAX] = {0};
	int n;
	scanf("%d",&n);
	result[0] = 1;//數組裏此時存的是大數0000....1
	for(int i=2; i<=n; i++)//計算n!
	{
		int k = 0;//k爲進位數
		for(int j=0; j<MAX; j++)//result[j]存當前位的數
		{
			int sum = k + result[j] * i;//得到i!當下次i++時就得到i++的階乘
			result[j] = sum % 10;//得到當前最低位
			k = sum / 10;//保存進位數
		}
	}
	int l;
	for(l=MAX-1; result[l] == 0; l--)//除去前導0
		;
	for(int j=l; j>=0; j--)
		printf("%d",result[j]);
	printf("\n");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章