问题给定:Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89,......
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。
有人可以帮助我解决我的代码中的逻辑错误,即使我认为它是正确的,它也不会报告正确的答案。谢谢!当输出为19544084时,输出为500693。
long val1 = 1, val2 = 1, valEven = 2, total = 0;
while (val2 < 4000000 && val1<4000000) {
total += valEven; //only add even numbers to total
val1 += val2 + valEven;
val2 += val1 + valEven;
valEven += val1 + val2;
}
System.out.println(total);
答案 0 :(得分:1)
问题陈述是(来自here):
Fibonacci序列中的每个新术语都是通过添加 前两个任期。从1和2开始,前10个术语将 是:
1,2,3,5,8,13,21,34,55,89,......
考虑Fibonacci序列中的值,而不是 超过四百万,找到偶数值的总和。
你应该做什么:
你做错了什么:
如果你想使用&#34;斐波那契的每三个数字都是偶数&#34;然后你应该按顺序得到3个数字,然后在你的总数中加第三个。我认为你使用的是+=
运算符错误。
a += b;
装置
a = a + b;
代码应该是这样的:
long val1 = 1, val2 = 1, valEven = 2, total = 0;
while (val2 < 4000000 && val1 < 4000000) {
total += valEven; // only add even numbers to total
val1 = val2 + valEven;
val2 = val1 + valEven;
valEven = val1 + val2;
}
System.out.println(total);
答案是:4613732
答案 1 :(得分:1)
这是关于调试的一般答案。
我在你的代码中添加了一个println语句来查看中间结果。
这是可运行的代码。
public class FibonacciTest {
public static void main(String[] args) {
long val1 = 1, val2 = 1, valEven = 2, total = 0;
while (val2 < 4000000 && val1 < 4000000) {
total += valEven; // only add even numbers to total
val1 += val2 + valEven;
val2 += val1 + valEven;
valEven += val1 + val2;
if (val1 < 1000L)
System.out.println(val1 + " " + val2 + " " + valEven);
}
System.out.println(total);
}
}
以下是结果。
4 7 13
24 44 81
149 274 504
927 1705 3136
5600910
如您所见,您没有正确计算斐波纳契数列,因此您无法正确计算偶数的总和。
首先,让我们修复Fibonacci序列。您需要3个值才能正确计算Fibonacci序列。让我们在长常数上附加一个“L”。
public class FibonacciTest {
public static void main(String[] args) {
long val1 = 1, val2 = 2, val3 = 2, total = 0;
while (val1 < 4_000_000L) {
if (val1 < 1000L) {
System.out.println(val1 + " " + val2 + " " + val3);
}
val3 = val1 + val2;
val1 = val2;
val2 = val3;
}
System.out.println(total);
}
}
这是前几个结果。
1 2 2
2 3 3
3 5 5
5 8 8
8 13 13
13 21 21
21 34 34
34 55 55
55 89 89
89 144 144
现在我们正确生成Fibonacci序列,让我们加上偶数值。
public class FibonacciTest {
public static void main(String[] args) {
long val1 = 1L, val2 = 2L, val3 = 2L, total = 0L;
while (val1 < 4_000_000L) {
val3 = val1 + val2;
val1 = val2;
val2 = val3;
if (val1 % 2L == 0L) {
System.out.println(val1);
total += val1;
}
}
System.out.println(total);
}
}
以下是结果。
2
8
34
144
610
2584
10946
46368
196418
832040
3524578
4613732
总和得到4613732.
答案 2 :(得分:0)
你正在使用一个聪明的事实,即在斐波那契序列中,数字是奇数奇数偶数,奇数奇数偶数,......(因为加法)
int valOdd1 = 1, valOdd2 = 1, valEven = 2;
long total = 0;
while (valEven <= 4000000) {
total += valEven; //only add even numbers to total
valOdd1 = valOdd2 + valEven;
valOdd2 = valEven + valOdd1;
valEven = valOdd1 + valOdd2;
}
写出:
valOdd1' = valOdd2 + valEven;
valOdd2' = valEven + valOdd1';
valEven' = valOdd1' + valOdd2';
valOdd2' = 2*valEven + valOdd2;
valEven' = 3*valEven + 2*valOdd2;
int valOdd2 = 1, valEven = 2;
long total = 0;
while (valEven <= 4000000) {
total += valEven; //only add even numbers to total
int nextValOdd2 = 2*valEven + valOdd2;
valEven = 3*valEven + 2*valOdd2;
valOdd2 = nextValOdd2;
}
错误是在条件下,(1)&#34;不超过&#34;暗示<=
和(2)valEven
必须在每个循环步骤中作为最后一个结果进行测试。
另外(3)+=
应该只是=
。更小的错误结果是通过一个序列踩踏更大步骤的效果。