用C ++计算和

时间:2012-02-03 20:16:22

标签: c++ sum series

我编写了以下代码来汇总系列(-1)^i*(i/(i+1))。但是当我运行它时,我得到任何n值的-1

有人可以指出我做错了什么吗?提前谢谢!

#include <iostream>
using namespace std;

int main()
{
    int sum = 0;
    int i = 1.0;
    int n = 5.0;

    for(i=1;i<=n;i++)
        sum = (-1)^i*(i/(i+1));

    cout << "Sum" <<" = "<< sum << endl;
    return 0;
}

7 个答案:

答案 0 :(得分:14)

问题#1: C ++ ^运算符不是数学运算符。这是一个按位异或。

您应该使用pow()代替。

问题#2: 您将浮点类型存储为整数类型。因此,以下内容将导致integer division (truncated division)

i/(i+1)

问题#3: 你实际上并没有总结任何事情:

sum = ...

应该是:

sum += ...

代码的更正版本如下:

double sum = 0;
int i = 1;
int n = 5;

for(i = 1; i <= n; i++)
    sum += pow(-1.,(double)i) * ((double)i / (i + 1));

虽然在这种情况下你真的不需要使用pow。奇数/偶数的简单测试就可以了。

double sum = 0;
int i = 1;
int n = 5;

for(i = 1; i <= n; i++){
    double val = (double)i / (i + 1);
    if (i % 2 != 0){
        val *= -1.;
    }
    sum += val;
}

答案 1 :(得分:4)

你需要把sum + = pow(-1,i)*(i /(i + 1));

否则每次都会失去以前的结果。

使用pow功能进行动作操作。

编辑:如在其他帖子中所述,使用double或float而不是int来避免截断分割。

答案 2 :(得分:3)

这个怎么样

((i % 2) == 0 ? 1 : -1)

而不是

std::pow(-1, i)

完整答案:

double sum = 0;
int i = 1.0;
int n = 5.0;
for (i = 1; i <= n; ++i) {
    signed char sign = ((i % 2) == 0 ? 1 : -1);
    sum += sign * (i / (i+1));
}

答案 3 :(得分:2)

几个问题:

  1. ^是按位排他或在c ++中没有“提升到电源”。使用pow()方法。

  2. 从最后一行移除悬空开口支架

  3. 分配给整数时,使用不浮动的内容。

答案 4 :(得分:2)

您的代码似乎有些问题:

using namespace std;

这与您手头的问题没有直接关系,但不要说using namespace std;它会引入微妙的错误。

int i = 1.0;
int n = 5.0;

您正在使用浮点常量初始化整数变量。尝试

int i = 1;
int n = 5;


sum = (-1)^i*(i/(i+1));

此表达式存在两个问题。首先,数量(i/(i+1))始终为零。请记住将结果分成两个int轮。其次,^没有按照你的想法做到。它是独占或运算符,而不是取幂运算符。第三,^的绑定比*更紧密,所以你的表达式是:

-1 xor (i * (i/(i+1)))

-1 xor (i * 0)
-1 xor 0
-1

答案 5 :(得分:1)

^没有按照您的想法行事。您的代码中还有其他一些错误。

应该是什么:

#include <iostream>
#include <cmath>

int main( )
{
    long sum = 0;
    int i = 1;
    int n = 5;

    for( i = 1; i <= n; i++ )
        sum += std::pow( -1.f, i ) * ( i / ( i + 1 ) );

    std::cout << "Sum = " << sum << std::endl;

    return 0;
}

要获取值的力量,请使用std::powsee here)。此外,您无法将int分配给小数值。为此,您需要使用floatdouble

前面提到的^是一个按位异或,而不是指数的标记。

另外请注意Integer Arithmetic,因为您可能会得到意想不到的结果。您最有可能希望将变量更改为floatdouble

答案 6 :(得分:1)

代码存在一些问题:

int sum = 0;

中间结果不是整数,这应该是双重

int i = 1.0;

由于你将在一个除法中使用它,它应该是一个双精度数,如果以整数计算,则1/2为0。

int n = 5.0;

这是一个int,不是浮点值,不需要.0。

    for(i=1;i<=n;i++)

你已经将i初始化为1,为什么要再次?

sum = (-1)^i*(i/(i+1));

每次迭代都会丢失之前的值,您应该使用sum + ='new values'

此外,您不需要pow来计算(-1)^i,所有这一切都在+1和-1之间切换,具体取决于i的奇数/偶数状态。您可以使用if语句或使用2 for来更轻松地完成此操作,其中一个用于奇数i一个用于偶数...真的很多选择。