项目欧拉#2;代码无法输出正确的答案

时间:2016-10-01 15:32:54

标签: java

问题给定: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);

3 个答案:

答案 0 :(得分:1)

问题陈述是(来自here):

  

Fibonacci序列中的每个新术语都是通过添加   前两个任期。从1和2开始,前10个术语将   是:

     

1,2,3,5,8,13,21,34,55,89,......

     

考虑Fibonacci序列中的值,而不是   超过四百万,找到偶数值的总和。

你应该做什么:

  • 列出少于4百万的斐波纳契数
  • 遍历它们并计算该列表中偶数的总和

你做错了什么:

  • 获取斐波那契数字的逻辑是错误的
  • 您没有检查偶数

如果你想使用&#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)+=应该只是=。更小的错误结果是通过一个序列踩踏更大步骤的效果。