目前,我正在做一些Project Euler问题,我遇到了第二个问题。
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。
我在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!我该如何解决这个问题?
答案 0 :(得分:5)
该行
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 ...
^ ^ ^ ^
请注意,模式是偶数,奇数,奇数,偶数,奇数,奇数,偶数,奇数,奇数等。这种趋势仍然存在,如果您愿意,您甚至可以通过归纳证明这是正确的。鉴于此,您可以通过总结每三个Fibonacci数(从零开始)来使您的代码更清晰。您可以通过为这些数字的总和找到一个漂亮的闭合表达式来进一步优化这一点,但我会将其作为练习。 : - )
希望这有帮助!
答案 1 :(得分:2)
evsum += evsum + a;
当然你想这样做? ;)
答案 2 :(得分:2)
这看起来不正确:
evsum += evsum + a;
// ^^ Maybe =
答案 3 :(得分:2)
evsum += evsum + a;
此行中有拼写错误,应为evsum = evsum + a;
或evsum += a;
答案 4 :(得分:2)
将声明evsum + = evsum + a更改为evsum = evsum + a
你错误地将evsum两次添加到该行的最终结果中。
610 + 198 + 198 = 1006
答案 5 :(得分:2)
你的补充完全是假的。这个错误在系列中显示得太晚的原因是,a
在此之前甚至都没有(除了2
之外),只有b
。解决此问题,只需使用evsum += a
和evsum += b
。