斐波那契数列算法

4

我试图找到斐波那契数列中第一个包含N个数字的数(N在500到2000之间)。我尝试使用以下代码实现:

BigInteger num = BigInteger.valueOf(2);
BigInteger num1 = BigInteger.ONE;
BigInteger num2 = BigInteger.ONE;
int record = 0;
BigInteger TEN = BigInteger.valueOf(10);

public BigInteger run()
{
    BigInteger temp = BigInteger.ZERO;
    while(num2.compareTo(TEN.pow(SomeN - 1)) < 0)
    {
        if(num2.compareTo(TEN.pow(record + 1)) >= 0)
        {
            System.out.println(""+record);
            record++;
        }

        temp = num1.add(num2);
        num1 = num2;
        num2 = temp;

        num = num.add(BigInteger.ONE);
    }
    System.out.println(""+num);
    System.out.println(""+num2);
    return num2;
}

问题是,当我测试1500位数字时,得到的答案明显是错误的。我不知道答案应该是什么,即使我检查了其附近的答案,以防我的算法误差为10的幂(即我检查了1499位和1501位),但是没有取得任何效果。有人看到问题在哪里吗?


是的,我是。我不是在寻找答案,我只是对这里出了什么问题感到困惑。我的方法是有效的,当我插入println()来检查打印的顺序时,我得到了一个正确的顺序(至少对于前40个整数)的斐波那契数列... - Jonathan
1
这不是作业。这是来自projecteuler(projecteuler.net)的问题(问题25)。我不是在寻找解决方案,而是想知道这里出了什么问题。我通过将我的答案作为问题的结果进行测试。我认为projecteuler很不可能在这里给出错误的结果,尤其是考虑到一些人已经正确回答了。 - Jonathan
1
抱歉关于作业的事情。我不知道这段代码有什么问题,但是我可以提供一个使用不同方法的可行解决方案。 - Paco
1
@Paco:为你的道歉点赞。我们中间很少有人愿意承认自己的错误,更不用说为此道歉了。 - Jonathan
4
离题了,您可以写System.out.println(record)而不需要模仿盲目引用的引号。 - akuhn
显示剩余12条评论
2个回答

1

(删除了完全不相关的提示)

编辑:EP网站已经恢复,当我使用您的代码得到的答案与很久以前网站接受的正确答案相匹配。


它似乎在序列中至少到第500个数字时运行良好 :) - Bozho
我再次仔细检查了一遍,对于输入N=2,我确实得到了13,而对于N=3,我得到了144。 - Jonathan

0
当然,在这里完全没有理由使用BigInteger形式。log10函数在一行代码中就足够了。已经完成了...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接