C++错误,添加偶数

C++ Error, adding even numbers

本文关键字:添加 错误 C++      更新时间:2023-10-16

可能重复:
偶数fibonacci数之和

目前,我正在做一些Project Euler问题,我正在处理第二个问题。

通过考虑Fibonacci序列中值不超过400万的项,找到偶数值项的和。

我正在用C++做这个问题,我认为我的代码非常好,因为在某种程度上,一切都是正确的,但后来,一切都失控了。。。代码:

#include <iostream>
using namespace::std;
int main() {
    int a = 1;
    int b = 1;
    int evsum = 0;
    while (a < 4000000 and b < 4000000) {
        a = a + b;
        b = a + b;
        if (a % 2 == 0)
            evsum += evsum + a;
        if (b % 2 == 0)
            evsum = evsum + b;
        cout << a << endl;
        cout << b << endl;
        cout << evsum << "evensum" << endl;
    }
}

xCode编译器会正确打印所有内容,直到。。。

2
3
2evensum
5
8
10evensum
13
21
10evensum
...
...
233
377
198evensum
610
987
1006evensum

出于某种原因,编译器将610添加到198,并认为它等于1006!!!我该怎么解决这个问题???

evsum += evsum + a;

相当于

evsum = evsum + evsum + a;

请注意,这会在evsum中添加两次。这与您的bug相匹配;计算机加610和198得到1006,因为610+198+198=1006,因为198加了两次。我想你是想让这个成为

evsum += a;

试着改变它,看看它是否能解决问题。

也就是说,让我们看看我们是否能在偶数斐波那契数中发现一个模式。Fibonacci序列如下:

 0  1  1  2  3  5  8 13 21 34 55 89 ...
 ^        ^        ^        ^

注意,这个模式是偶数、奇数、奇数、偶数、奇数,奇数、偶数,奇数、奇数,等等。这种趋势还在继续,如果你愿意,你甚至可以通过归纳来证明这是真的。考虑到这一点,您可以通过对每三个斐波那契数(从零开始)进行求和来使代码更干净。你可能会通过为这些数字的总和找到一个很好的闭合形式表达式来进一步优化这一点,但我将把它作为一个练习。:-)

希望这能有所帮助!

您的添加完全是伪造的。这个bug之所以在系列中出现得如此之晚,是因为a在那之前从来都不是偶数(除了开头的2),只有b。解决这个问题,只需使用evsum += aevsum += b

下面是一个关于固定代码Ideone的实际示例。

evsum += evsum + a;

你确定要那样做吗?)

这看起来不正确:

evsum += evsum + a;
//    ^^ Maybe =

evsum += evsum + a;这一行有一个拼写错误,应该是evsum = evsum + a;evsum += a;

将语句evsum+=evsum+a更改为evsum=evsum+a

您错误地将evsum两次添加到该行的最终结果中。

610+198+198=1006