我被赋予了编写显示以下内容的程序的任务:
我编码了这个:
#include<iostream.h>
#include<conio.h>
void main()
{
clrscr();
int a, n = 1, f = 1;
float s = 0;
cin >> a;
while(n <= a)
{
f = f * n;
s += 1 / (float)f;
n = n + 1;
}
cout << s;
getch();
}
所以这显示 -
s = 1 + 1/2! + 1/3! + 1/4! .... + 1 / a !,包括奇数和偶数阶乘。
在过去的两个小时里,我试图弄清楚如何修改此代码,以便显示所需的结果。但我还无法弄明白。
我应该对代码做出哪些更改?
答案 0 :(得分:1)
您几乎拥有所需的一切(假设您不希望根据评论中提出的问题进行设计更改)。
您需要更改的是您在每个步骤中乘以f
的内容。建立n!您在每一步中乘以n
。建立(2n)!你会乘以2*n*(2*n-1)
编辑:关于教师想要什么的第二个理论只需要稍微改变一下。你的内环可以用
代替 while(n < a)
{
f = f * n * (n+1);
s += 1 / f;
n = n + 2;
}
Edit2:为了运行你的程序,我对你在我的GCC副本中无效的I / O事情进行了一些更改。希望这些不会分散以下代码的要点。我还添加了第二种更复杂,更准确的计算答案的方法,以查看浮点舍入丢失了多少。
所以这段代码计算答案两次,一次是通过我建议你改变你的代码的方法,一次是通过更准确的方法(使用double而不是float并通过递归函数在更准确的序列中添加数字)。然后它显示你的答案和两个答案之间的差异。
运行显示我建议的版本会使所有显示的数字都正确,并且a
的值只是错误的我试过了需要更多显示精度的微量数据:
#include<iostream>
using namespace std;
double fac_sum(int n, int a, double f)
{
if ( n > a )
return 0;
f *= n * (n-1);
return fac_sum(n+2, a, f) + 1 / f;
}
int main()
{
int a, n = 1;
float f = 1;
float s = 0;
cin >> a;
while(n < a)
{
f = f * n * (n+1);
s += 1 / f;
n = n + 2;
}
cout << s;
cout << " approx error was " << fac_sum( 2, a, 1.0)-s;
return 0;
}
对于显示0.54308 approx error was -3.23568e-08
的8
我希望您理解e-08表示法,意思是错误位于.
编辑3:我已将f
更改为浮动在此帖子中,因为我复制/测试过思考f
是float
,所以当我{{1}时,我的部分答案没有意义} {是f
答案 1 :(得分:1)
您需要在检查计数器[object HTMLInputElement]
时累积总和,并仅计算偶数因子:
n
在您的代码中:
int n;
double sum = 1;
cin >> n;
for(int i = 2; i < n; ++i{
if(i % 2 == 0) sum += 1 / factorial(i);
}