【问题标题】:Finding an answer according to " Fibonacci sequence"根据“斐波那契数列”寻找答案
【发布时间】:2012-06-30 15:49:43
【问题描述】:

请看下面的代码

package Euler;

import java.util.ArrayList;
import java.util.List;

public class Problem2
{
    public static void main(String[]args)
    {
        int firstNumber=1;
        int secondNumber=2;
        int thirdNumber = 0;

        int sum = 0;

        List array = new ArrayList();

        while(true)
        {

            if(thirdNumber>=400000)
            {
                break;
            }
            else
            {
                thirdNumber = firstNumber+secondNumber;
                System.out.println(thirdNumber);


                 if(thirdNumber%2==0)
                {
                    array.add(thirdNumber);
                }

                firstNumber = secondNumber;
                secondNumber = thirdNumber;
            }
        }

        for( int i=0;i<array.size();i++)
        {
            int num = Integer.parseInt(array.get(i).toString());

            sum = sum+num;
        }

        System.out.println("The Sum is: "+sum);
    }
}

在这里,我正在尝试解决来自 Project Euler 的 this 问题,无论如何,这就是问题所在。

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

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

通过考虑斐波那契数列中的项,其值不 超过四百万,求偶数项之和。

这就是我得到的答案——257112;

它说答案是错误的。我不知道为什么会这样。供您参考,我的母语不是英语,我也没有用英语做数学。所以我怀疑我是否误解了这个问题。

请帮助我找到解决此问题的正确方法。谢谢

【问题讨论】:

  • @nhahtdh 不,序列中小于四百万的项并不多。与int 一起工作正常。
  • 这是一个项目欧拉问题,所以人们应该避免提供解决方案。
  • 正确答案是 sum = 4613732。在担心总和之前,您应该确保斐波那契数是正确的。看看您是否可以创建一个值列表并获得正确的值。

标签: java math arraylist fibonacci


【解决方案1】:

通过考虑斐波那契数列中值不超过四百万的项...

这里有个问题:

if(thirdNumber>=400000)

那不是四百万。你还需要一个零。

【讨论】:

  • 感谢您的回复。其余的东西都对吗?我的意思是,我是否遵循正确的数学方法?
  • @user1484871:好吧,我快速浏览了一下,看起来还不错,但是这条线有点……呃……不必要:int num = Integer.parseInt(array.get(i).toString());为什么都转换为字符串,然后将其解析回一个 int?一开始它已经是Integer。只需致电intValue。并使用通用列表,因此您无需强制转换。您也可以随时计算总和,而不是将整数存储在列表中,然后在最后求和。该列表根本不需要。
  • 您似乎也没有在总和中包括术语2。您添加数组的第一项似乎是8
  • 太棒了!非常感谢您帮助我!
【解决方案2】:

您可以通过以下方式提高效率

  • 在计算斐波那契数时计算总和(因此您不必存储它们)
  • 如果您确实使用了集合,请使用泛型而不是转换为字符串并对其进行解析(这非常低效)
  • 请注意,每三个值都是偶数,因此您无需检查偶数。

试试

long a = 1, b = 1, c, sum = 0;
while ((c = a + b) < 4000000) {
    sum += c;
    a = b + c;
    b = c + a;
}
System.out.println(sum);

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 2021-08-31
    • 2014-08-07
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多