1. 程式人生 > >c++ 求sum(n!),n可以為極大的數 並程式計算執行時間

c++ 求sum(n!),n可以為極大的數 並程式計算執行時間

 此程式為用C++求1! + 2! + 3! +  …… + n!

其中n可以為極大的數,通常情況下double型只能存放1! + 2! + 3! + …… + 170!採用陣列的方法儲存資料可以做到算無窮大的數的階乘的和,期限制因素只在於程式中定義的陣列的大小。假如有比該程式更高的要求,可以更改陣列大小,以得到正確結果。

#include <iostream>
#include <time.h>
using namespace std;
int main()
{
	clock_t start, stop;
	int n, step = 0;
	do                          //進行輸入
	{
		cout << "please input n:\n";
		cin >> n;
                start = clock();      //獲得開始時間
		if (n == 0)            //n == 0的情況
		{
			cout << "sum(0!)= 1\n";
			break;
		}
		if (n > 0)               //n > 0的情況
		{
                        int num[30] = {0};  //儲存n的陣列
			int mul[10000] = {0};    //儲存n!
			int sum[10000] = {0};   //儲存n!的和
                        mul[0] = 1;
			int b = 1;
			for (int numb = 1; numb <= n; numb++)      //n次迴圈 
			{
				int mult[10000] = {0};                 //暫存numb!
				int j = 0, nu = numb, i, k;
				do                            //將numb的數值存到數值中
				{
					num[j] = nu % 10;
					nu = nu / 10;
					j++;
				}
				while (nu != 0);
				for (int i = 0; i < j; i++)             //求numb! 
				{
					for (int k = 0; k < b; k++)
					{
							mult[i + k] += num[i] * mul[k];
					}
				}	
				///////////////////////////////
				b = b + j - 1;      //總位數為numb的位數+ (numb - 1)!的位數
				for (int i = 0; i < b; i++)            //進位
				{
					mult[i + 1] += mult[i] / 10;
					mult[i] %= 10;
				}
				if (mult[b] != 0)             //如果最高位上有進位,位數加一
				{
					b++;
				}
				for (int i = 0; i < b; i++)             //將numb!的結果儲存
				{
					mul[i] = mult[i];
				}
				//////////////////////////
				for (int i = 0; i < b; i++)           //求numb!的和
				{
					sum[i] += mul[i];
				}
				for (int i = 0; i < b; i++)           //進位
				{
					sum[i + 1] += sum[i] / 10;
					sum[i] %= 10;
				}
				/////////////////////////////////////
			}	
			cout << "sum(" << n << "!) = ";                  //輸出n!的和
			for (int i = b - 1; i >= 0; i--)
			{
				cout << sum[i];
			}
			cout << endl;
			break;
		}
		else                                       //n為非法字元的情況 
		{
			cout << "the num you input is ileagall!\n";
		}
		step++;
	} 
	while(step < 3);                                  //三次輸入錯誤
	stop = clock();                                    //獲得結束時間
	cout << "use time :" << (double)(stop - start) / CLOCKS_PER_SEC << “(s)” << endl;   //輸出所用時間
	return 0;
}

以下為1! + 2! + 3! + …… + 10!的執行結果:

以下為1! + 2! + 3! + …… +200!的結果:

程式中尚有很多不足之處,請初學者通讀、思考之後採用,也希望各位大神多加指點。

程式中階乘和進位部分有參考。