关于java.lang.NullPointerException的Project Euler#25的难题

时间:2013-05-04 10:18:43

标签: java algorithm

我正在制作项目Euler#25。我打算在BigInteger数组中保存所有斐波纳契数。但是,抛出一个NullPointerException,我不知道为什么以及如何避免它。我知道有更简单的算法来解决这个问题。但我只是想知道我的错误在哪里,非常感谢你!以下是问题陈述:Fibonacci序列由递归关系定义:

Fn = Fn-1 + Fn-2,其中F1 = 1且F2 = 1.因此前12个术语将是:

F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144第12项F12是第一项包含三位数。

Fibonacci序列中包含1000位数的第一项是什么?

我的代码如下:

  private static BigInteger[] fibonacci;
    public static void main(String[] args) {
        for(int i = 0; fibonacci[fibonacci.length-1].toString().length() < 1000; i++){
            if(i == 0)
                fibonacci[i] = BigInteger.ZERO;
            if(i < 3)
                fibonacci[i] = BigInteger.valueOf(1);
            else
                fibonacci[i] = fibonacci[i - 1].add(fibonacci[i - 2]);
        }
        System.out.println(fibonacci.length);
    }

2 个答案:

答案 0 :(得分:3)

您尚未初始化数组fibonacci。您需要在使用阵列之前分配内存。

private static BigInteger[] fibonacci = new BigInteger[1000]; // Some number x

我建议您使用List而不是数组,因为您不知道数组的大小。

private static List<BigInteger> fibonacci = new ArrayList<BigInteger>();

此外,如果您正在使用数组,fibonacci[fibonacci.length - 1]将无效,因为如果您将数组大小初始化为1000,则始终检查位置999.为此,您必须使用{{1然后你可以使用

ArrayList

答案 1 :(得分:3)

您从未初始化fibonacci数组。

只需使用

private static BigInteger[] fibonacci = new BigInteger[1000]();

或更好地将您想要计算的斐波那契数量提取到单独的常数:

private static int amount = 1000;
private static BigInteger[] fibonacci = new BigInteger[amount]();;

public static void main(String[] args) {
  for(int i = 0; i < amount; i++){
    if(i == 0)
      fibonacci[i] = BigInteger.ZERO;
    else if(i < 3)
      fibonacci[i] = BigInteger.valueOf(1);
    else
      fibonacci[i] = fibonacci[i - 1].add(fibonacci[i - 2]);
}

System.out.println(fibonacci.length);