欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++ 求sum(n!),n可以为极大的数 并程序计算运行时间

程序员文章站 2024-03-15 19:08:06
...

 此程序为用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!的运行结果:

c++ 求sum(n!),n可以为极大的数 并程序计算运行时间

以下为1! + 2! + 3! + …… +200!的结果:

c++ 求sum(n!),n可以为极大的数 并程序计算运行时间

程序中尚有很多不足之处,请初学者通读、思考之后采用,也希望各位大神多加指点。

程序中阶乘和进位部分有参考。

相关标签: c n的阶乘