1. 程式人生 > >ACM 大數運算 【計算1000以內的階乘】

ACM 大數運算 【計算1000以內的階乘】

題目:

輸入不超過1000的正整數N,輸出N!=1x2x3x4……xN的精確結果

樣例輸入:30
樣例輸出:265252859812191058636308480000000


思路:由於數值過大,無法用任何型別的將其儲存,故使用乘法的基本算式求解。 例子:
用一個len去記錄當前的結果有多少位,每次用已經儲存(用大陣列儲存)的數的每一位去乘以需要乘的值,然後用相乘所得的值與進位值相加然後再取10的餘數取更新當前位置的值。  直到最後一位乘了以後如果進位值不為0繼續往上進位。 比如上圖中說第一次進行 5 X 3 = 15   進位值預設為0 則(15 + 0)%10獲得的值去更新當前位置的值  5 更新為 5 最後一次後 3 更新為 0 ,檢測到進位值不為0,則進位。 以下為程式碼:
#include <iostream>
#include <stdio.h>
#include <algorithm> 
#include <string.h>
using namespace std;
int main()
{
	int n;//定義n 
    while(scanf("%d",&n) != EOF)//迴圈輸入 
    {
    	int ans[100000] = {1,0},size = 1,carry = 0;//定義並且初始化所有需要的值 
    	for(int i = 2;i <= n;i++)//從2到當前需要階乘的值 
    	{
    		for(int j = 0;j < size;j++)//遍歷所有已經有的值 
    		{
    			int temp = ans[j]*i + carry;//用已經有的每個值去乘數並且加上進位 
    			ans[j] = temp%10;//除去進位後的是當前位置上的數 
    			carry = temp/10;//用除以10 求得應該進多少位 
			}
			while(carry != 0)//只要進位的值不等於0 
			{
				ans[size++] = carry % 10;//最大值進位 
				carry /= 10; //進位後進位值變小 
			}
		}
		for(int i = size - 1;i >= 0;i--)//倒序遍歷 
		{
			printf("%d",ans[i]);//輸出數組裡的每個值 
		}
    }
	return 0;//結束主函式 
}