我现在正在Visual Studio中编写控制台程序 我的程序应该计算以下系列的总和:
1!+3!+5!+...+(2N+1)!,
其中N
的整数大于 0 (用户应首先输入N)。
不幸的是,我只能计算1!+2!+3!+...(N)!
/* Calculates sum of 1!+2!+3!+...+(N)! */
#include <iostream>
using namespace std;
int main()
{
int i=1, n, fact = 1, sum = 0;
cout<<"Enter n";
cin >> n;
while(i <= n)
{
fact = fact * i;
i++;
sum = sum + fact;
}
cout<<"Sum is "<<sum<<"\n";
return 0;
}
那么如何让我的程序计算
的总和1!+3!+5!+...+(2N+1)!
答案 0 :(得分:2)
它就像
一样简单while(i <= 2*n+1)
{
fact = fact * i;
if (i%2)
sum = sum + fact;
i++;
}
您希望每次都允许循环迭代,以便您的乘法包括偶数和奇数(否则第二项将是3*1
,而不是3*2*1
);但只有在您查看要添加到总数中的奇数时,才会这样做。
另一种方法是仅在奇数上循环,但每次乘以当前数字及其前身:
while(i <= 2*n+1)
{
fact = fact * i * (i>1 ? i-1 : 1);
sum = sum + fact;
i+=2;
}
这有点复杂。您现在正在循环使用奇数(因为i+=2
,因此您需要在每个阶段乘以i
和i-1
。但是您需要小心第一步:当i==1
时,你不想乘以0!所以我们需要一个三元表达来确保它不会发生。
或者我们可以从i=3
开始:
int i=3, sum=1, fact=1;
while(i <= 2*n+1)
{
fact = fact * i * (i-1);
sum = sum + fact;
i+=2;
}
这现在按预期工作,但我们需要将sum
初始化为1
,因为循环现在错过了i==1
的情况。也许这更清洁了。
但是请注意,在您遇到int
溢出之前,您将无法走得更远!你可以通过long long
进一步了解,但即便如此,阶乘也是巨大的,并且当你点击n==10
左右时,你想要使用任意大小的整数类(10是一个估计 - 我还没有计算出来。)