3

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

有人可以指出我做错了什么吗?先感谢您!

#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;
}
4

7 回答 7

14

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

你应该pow()改用。

问题 #2: 您将浮点类型存储为整数类型。所以以下将导致整数除法(截断除法)

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;
}
于 2012-02-03T20:18:46.970 回答
4

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

否则,您每次都会丢失先前的结果。

使用 pow 函数进行 pow 操作。

编辑:正如在其他帖子中所说,使用 double 或 float 而不是 int 以避免截断除法。

于 2012-02-03T20:19:25.390 回答
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));
}
于 2012-02-03T20:24:01.880 回答
2

几个问题:

  1. ^ 是按位排他的,或者在 c++ 中不是“提升权力”。使用 pow() 方法。

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

  3. 分配给整数时使用整数而不是浮点数。

于 2012-02-03T20:20:00.683 回答
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结果除以两个 s 轮。第二,^不做你认为它做的事。它是异或运算符,而不是幂运算符。第三,^结合得不那么紧密*,所以你的表达是:

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

-1 xor (i * 0)
-1 xor 0
-1
于 2012-02-03T20:24:30.800 回答
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一个用于偶数......确实有很多选择。

于 2012-02-03T20:27:33.217 回答
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::pow请参阅此处)。您也不能分配int给十进制值。为此,您需要使用floator double

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

还要小心整数运算,因为您可能会得到意想不到的结果。您很可能希望将变量更改为floatdouble

于 2012-02-03T20:21:35.487 回答