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!的结果:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值