Bil*_*ljk 0 c++ math fibonacci
可能重复:
偶数斐波纳契数的总和
目前,我正在做一些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;
}
}
Run Code Online (Sandbox Code Playgroud)
xCode编译器正确打印所有内容,直到......
2
3
2evensum
5
8
10evensum
13
21
10evensum
...
...
233
377
198evensum
610
987
1006evensum
Run Code Online (Sandbox Code Playgroud)
出于某种原因,编译器将610添加到198并认为它等于1006!我该如何解决???
这条线
evsum += evsum + a;
Run Code Online (Sandbox Code Playgroud)
相当于
evsum = evsum + evsum + a;
Run Code Online (Sandbox Code Playgroud)
请注意,这会增加evsum
两次.这符合你的bug; 计算机添加610和198得到1006因为610 + 198 + 198 = 1006,因为198加了两次.我认为你的意思是这样的
evsum += a;
Run Code Online (Sandbox Code Playgroud)
尝试更改它,看看它是否修复了问题.
也就是说,让我们看看我们是否能够发现偶数斐波纳契数的模式.Fibonacci序列如下所示:
0 1 1 2 3 5 8 13 21 34 55 89 ...
^ ^ ^ ^
Run Code Online (Sandbox Code Playgroud)
请注意,模式是偶数,奇数,奇数,偶数,奇数,奇数,偶数,奇数,奇数等.这种趋势仍在继续,如果您愿意,您甚至可以通过归纳证明这是正确的.鉴于此,您可以通过总结每三个Fibonacci数(从零开始)来使您的代码更清晰.您可以通过为这些数字的总和找到一个漂亮的闭合表达式来进一步优化这一点,但我会将其作为练习.:-)
希望这可以帮助!