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

Java 欧拉2号项目;代码无法输出正确答案,java,Java,给出的问题:斐波那契序列中的每个新项都是通过将前两项相加而生成的。从1和2开始,前10个术语将是: 1、2、3、5、8、13、21、34、55、89 通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和 有人能帮我找出我的代码的逻辑错误吗?它没有报告正确的答案,尽管我认为它是正确的。谢谢输出为500693,本应为19544084 long val1 = 1, val2 = 1, valEven = 2, total = 0; while (val2 < 4000000 &a

给出的问题:斐波那契序列中的每个新项都是通过将前两项相加而生成的。从1和2开始,前10个术语将是:

1、2、3、5、8、13、21、34、55、89

通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和

有人能帮我找出我的代码的逻辑错误吗?它没有报告正确的答案,尽管我认为它是正确的。谢谢输出为500693,本应为19544084

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);
long val1=1,val2=1,valEven=2,total=0;
而(val2<4000000&&val1问题陈述是(来自):

斐波那契序列中的每个新项都是通过添加 前两个学期。从1和2开始,前10个学期将 是:

1、2、3、5、8、13、21、34、55、89

通过考虑Fibonacci序列中的项,其值不 超过四百万,求偶数项之和

你应该做什么:

  • 列出小于400万的斐波那契数
  • 遍历它们并计算该列表中偶数的总和
你做错了什么:

  • 你得到斐波那契数的逻辑是错误的
  • 您没有检查偶数
如果你想使用“斐波那契中每三分之一的数字是偶数”这一事实,那么你应该按顺序得到三个数字,然后将三分之一加到总数中。我认为你使用的运算符是错误的

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);
long val1=1,val2=1,valEven=2,total=0;
而(val2<4000000和&val1<4000000){
total+=valEven;//仅将偶数添加到total中
val1=val2+valEven;
val2=val1+valEven;
valEven=val1+val2;
}
系统输出打印项次(总计);

答案是:
4613732

这是关于调试的一般性答案

我在代码中添加了println语句以查看中间结果

4 7 13
24 44 81
149 274 504
927 1705 3136
5600910
2
8
34
144
610
2584
10946
46368
196418
832040
3524578
4613732
这是可运行的代码

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);
    }

}
正如你所看到的,你没有正确地计算斐波那契序列,所以你没有正确地计算偶数之和

首先,让我们修正斐波那契数列。你需要3个值来正确计算斐波那契数列。让我们在长常量后面加上一个“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);
    }

}
现在我们已经正确地生成了斐波那契序列,让我们把偶数相加

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);
    }

}

我得到了4613732的和。

你使用了一个聪明的事实,在斐波那契序列中,数字是奇偶,奇奇偶,…(因为加法)

int valOdd1=1,valOdd2=1,valEven=2;
长总计=0;

while(valEven)这还不足以诊断您的问题。您必须提供预期的(正确的)答案和您得到的实际答案。请编辑您的问题并添加这些。您应该为问题添加更多描述。只需粘贴Euler问题2的问题说明。感谢您的反馈。在斐波那契序列中,每三项中有一个偶数。您介意描述一下我获取斐波那契数的逻辑吗s是错的,并且检查偶数?@tsalemy如果你想使用“斐波那契中每三个数都是偶数”这一事实然后你应该按顺序得到3个数字,然后将第三个数字加到总数中。我认为你使用的运算符+=是错误的。请参阅答案中的更新。是的,很有意义,这是我不理解的关键逻辑错误。非常有帮助的答案。
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
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;
}