1. 程式人生 > >大數階乘演算法

大數階乘演算法

  大數階乘

                    一般想到階乘都是用遞迴或者迴圈的方法,但是一旦所給數字的範圍很大就會越界,得到意想不到的結果,今天我將寫一種大數階乘的方法,演算法比較簡單,思路也容易想到.

程式碼如下:

//本題題目源於HDU 1042 計算N!
#include <iostream>
using namespace std;
int main()
{
	int n,i,j;
	while (cin>>n)
	{
		int flag=1;
		int carry=0;        //設定進位
		int res=0;
		int str[40000];     //根據題目要求設定陣列的大小
		str[0]=1;
		for (i=2;i<=n;i++)   //從2開始計算階乘
		{
			for (j=1;j<=flag;j++)     //根據進位flag大小來判斷當前階乘結果的的位數
		     {
			res=str[j-1]*i+carry;
			str[j-1]=res%10;
			carry=res/10;
               	      }
			while (carry)  //當進位大於一時將結果擴充套件到下一位
			{
				flag++;
				str[flag-1]=carry%10;
				 carry/=10;
			}
		}
		for (i=flag-1;i>=0;i--)    //將結果陣列倒序輸出,注意最後一位是"i=flag-1",因為"flag=1" 對應str[0],以此類推
 		{
			 cout<<str[i];
		}
		 cout<<endl;
	 }
 	return 0;
}