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!的运行结果:
以下为1! + 2! + 3! + …… +200!的结果:
程序中尚有很多不足之处,请初学者通读、思考之后采用,也希望各位大神多加指点。
程序中阶乘和进位部分有参考。