【问题标题】:Calculating a Sum with C++用 C++ 计算总和
【发布时间】:2012-02-26 10:35:41
【问题描述】:

我编写了以下代码来总结系列(-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;
}

【问题讨论】:

  • 您认为^ 运算符的作用是什么?您是要执行异或运算,还是要执行幂运算?
  • 为什么要为整数分配浮点数? (int i = 1.0)
  • 首先你的设置总和循环的每一次通过,而不是添加到它的前一个值。第二个 ^ 并没有像你想象的那样提高力量。查看 c 数学库。并注意当你分成分数时发生的隐式转换。

标签: c++ sum series


【解决方案1】:

问题 #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;
}

【讨论】:

  • 另外,由于他的所有变量都是ints,它会进行整数数学运算,并且i/(i+1) 将始终计算为1,除非i == 0i==1
  • 那个出奇地难抓...花了我几分钟。
  • 忘了 pow() 已经有一段时间没有用 C++ 编写代码了
  • @Surfcast23 在这种情况下,您实际上不需要pow() - 因为您只是想获得-11
  • @ybungalobill 你是对的,我把分子和分母倒过来了,对我来说这是一个艰难的星期五
【解决方案2】:

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

否则你每次都会丢失之前的结果。

使用 pow 函数进行 pow 操作。

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

【讨论】:

    【解决方案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));
    }
    

    【讨论】:

      【解决方案4】:

      几个问题:

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

      2. 从最后一行删除悬空的左括号

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

      【讨论】:

        【解决方案5】:

        您的代码似乎有一些问题:

        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)) 的数量始终为零。请记住将两个ints 相除,结果会四舍五入。其次,^ 没有做你认为的事情。它是异或运算符,而不是幂运算符。第三,^ 的绑定不如* 紧密,所以你的表达式是:

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

        【讨论】:

        • 使用命名空间std导致什么错误,链接?
        • 讨论herehere
        • 感谢有关使用命名空间标准的链接。
        【解决方案6】:

        ^ 并没有按照你的想法去做。您的代码中还有其他一些错误。

        应该是什么:

        #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 (see here)。您也不能将int 分配给十进制值。为此,您需要使用floatdouble

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

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

        【讨论】:

        • 感谢所有回复的人!
        【解决方案7】:

        代码有几个问题:

        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,所有这一切都是根据i 的奇/偶状态在+1 和-1 之间切换。您可以使用 if 语句或使用 2 个 for 更轻松地做到这一点,其中一个用于奇数 i 一个用于偶数...确实有很多选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-16
          • 1970-01-01
          • 1970-01-01
          • 2012-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多