我不确定为什么当我将4000000放入方法的参数大小时,我的代码会产生错误的负值,即fib(4000000)?
问题问:
斐波那契数列中的每个新项都是通过将前两个项相加而生成的。从1和2开始,前10个项将是:
1,2,3,5,8,13,21,34,55,89,...
通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和。
我的第一个代码:
public void fib(int k) {
int result = 0;
int[] array = new int[k];
array[0] = 1;
array[1] = 2;
for (int i = 2; i < k; i++) {
array[i] = array[i - 2] + array[i - 1];
}
for (int even: array) {
if (even % 2 == 0) {
result += even;
}
}
System.out.println(result);
}
哪个没有用,所以我认为是因为数组太大(400万很多),所以我尝试编写不同的代码:
public void fib(int k) {
int sum = 0;
int term1 = 1;
int term2 = 2;
int term3 = 0;
int i = 2;
while (i < k) {
term3 = term1 + term2;
term1 = term2;
term2 = term3;
i++;
if (term2 % 2 == 0) {
sum += term2;
}
}
System.out.println(sum + 2);
}
这也没有用。
我的代码有什么问题?对于少量的
size
,它起作用,但对于较大的,它不起作用。在我搜索问题的答案后,我发现:
int term1 = 1;
int term2 = 2;
int i = 0;
int result = 0;
while (term1 < 4000000) {
i = term1;
term1 = term2;
term2 = term2 + i;
if (term2 % 2 == 0) {
result += term2;
}
}
System.out.println(result);
哪个有效。
最佳答案
我认为您没有遇到溢出问题。我认为您在错误地阅读问题。它说您应该查看所有斐波那契数字,其中数字的值小于等于4百万。相反,您正在查看前400万斐波那契数字。两者之间的区别在于:
1、2、3、5、8(所有纤维数均小于10)
和这个:
1、2、3、5、8、13、21、34、55、89(前10个Fib编号)
我认为它需要前者,但您正在做后者。
而不是做:
while (i < k) {
如果您这样做怎么办?
while (term1 < k) {
关于java - 甚至斐波那契的总和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30229035/