用C ++显示总和的程序?

时间:2015-09-19 11:17:19

标签: c++

我被赋予了编写显示以下内容的程序的任务:

  

enter image description here

我编码了这个:

#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 !,包括奇数和偶数阶乘。

在过去的两个小时里,我试图弄清楚如何修改此代码,以便显示所需的结果。但我还无法弄明白。

问题:

我应该对代码做出哪些更改?

2 个答案:

答案 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表示法,意思是错误位于.

右侧的第8位数字

编辑3:我已将f更改为浮动在此帖子中,因为我复制/测试过思考ffloat,所以当我{{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);
}