2016-10-01 70 views
-2

问题:Fibonacci序列中的每个新项都是通过添加前两项生成的。通过用1和2开始,第一10项将是:欧拉项目#2;代码未能输出正确的答案

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

通过考虑中的条款斐波纳契数列的值不超过四百万,找到偶数项的和。

有人能帮我弄清楚我的代码的逻辑错误,即使我认为它是正确的,它也不会报告正确的答案。谢谢!输出是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); 
+0

这还不足以诊断您的问题。你必须提供预期的(正确的)答案和你得到的实际答案。请编辑您的问题并添加。 –

+0

您应该为问题添加更多描述。只需粘贴欧拉问题2的问题陈述即可。 –

回答

1

的问题陈述是(来自here):

在Fibonacci序列中的每个新项通过将之前的 两个术语生成。通过用1和2开始,第一10个术语将 是:

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

通过考虑术语在斐波纳契数列中值不为 超过400万的情况下,找到偶数项的和。

你应该做的:超过400万

  • 导线对他们少

    • 名单Fibonacci数,并从该名单

    你在做什么错误计算偶数之和:

    • 您的逻辑获得斐波纳克CI号码是错的
    • 你不检查偶数

    如果你想使用的事实,“在斐波那契每逢第三个数字甚至是”,那么你应该在序列得到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

  • +0

    感谢您的反馈。在斐波那契数列中,每三个项就有一个偶数。你介意描述我的斐波那契数的逻辑是错误的,并检查偶数吗? – tsalemy

    +0

    @tsalemy如果你想使用“斐波纳契数字中每第三个数字都是偶数”的事实,那么你应该得到3个数字,然后在总数中加上第三个数字。我认为你正在使用运算符+ =错误。请参阅答案 –

    +0

    中的更新是很有意义的,这是我不理解的关键逻辑错误。非常有用的答案。 – tsalemy

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

    这里是结果。如你所见,你没有正确地计算斐波那契数列,所以你不能正确地计算偶数的总和。

    首先,我们来修复斐波那契数列。您需要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); 
        } 
    
    } 
    

    这里是前几个结果。

    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 
    

    既然我们正确地生成了斐波纳契数列,让我们加起来的偶数值。

    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的总和。

    +0

    非常感谢你非常有帮助 – tsalemy

    0

    你用聪明的事实,在Fibonacci序列中的数字,甚至奇奇(因为THA添加的),...奇奇偶,

    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),“不超过”意味着<=和(2)valEven必须为在每个循环步骤的最后结果进行测试。 (3)+=应该简单地是=。小得多的错误结果是通过一个序列步进更大步骤的效果。

    +0

    非常感谢你的帮助 – tsalemy