1
public class Arrays {
public static void main(String[] args){
long Fib[] = new long[100];
Fib[0] = 1;
Fib[1] = 1;
int i = 0;
    while(i <= 100){
        Fib[i+2]= Fib[i] + Fib[i+1];
        System.out.println(Fib[i]);
        i++;
    }

}
}

我用它来找到斐波那契数,但它在第 94 学期左右开始给我奇怪的读数。有人愿意解释吗?我对Java完全陌生,所以如果它很明显,请不要讨厌。这是错误输出的一些片段,但其他一切看起来都很好:

832040

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100

1346269

...

63245986

at Arrays.main(102334155
Arrays.java:8)

165580141

...

4660046610375530309

7540113804746346429

-6246583658587674878

1293530146158671551

-4953053512429003327

-3659523366270331776

-8612576878699335103

6174643828739884737
4

5 回答 5

7

这是解决方案。您正在尝试访问第 102 个元素 i + 2 其中 i = 100

 Fib[0] = 1;
 Fib[1] = 1;
 int i = 2;
 while(i < 100){
      Fib[i]= Fib[i-1] + Fib[i-2];
      System.out.println(Fib[i]);
      i++;
 }

此外,第 97 个斐波那契数超出long了 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的范围。97th Fibonacci 是 83,621,143,489,848,410,000 你应该使用BigInteger而不是long

下面的代码打印到 1000 位斐波那契数。

   BigInteger first = new BigInteger("0");
    BigInteger second = new BigInteger("1");
    BigInteger temp;// = new BigInteger("0");
    int counter = 1;

     while(numberOfDigits(second) < 1000)
     {
         temp = new BigInteger(second.toString());
         second = second.add(first);
         first = new BigInteger(temp.toString());
         counter++;
     }
     System.out.print(counter);


}

public static int numberOfDigits(BigInteger number)
{
      return number.toString().length();
}
于 2013-07-14T16:15:05.167 回答
2
java.lang.ArrayIndexOutOfBoundsException: 100

表示数组索引 100 不存在。

`long Fib[] = new long[100];`

创建索引 0 - 99

于 2013-07-14T16:16:44.527 回答
1

i达到 98 时,Fib[i+2]将评估为Fib[100],这将抛出一个,ArrayIndexOutOfBoundsException因为Fib长度为 100 并且数组是零索引(正如您通过分配 演示的那样Fib[0])。

此外,您会得到负面结果,因为结果太大而无法放入 along中,因此它们会溢出。long 的最大值是9,223,372,036,854,775,807,第 93 个斐波那契数是第一个超过这个值的12,200,160,415,121,876,738

于 2013-07-14T16:22:22.933 回答
1

数组中不需要生成斐波那契数列。另一个技巧是使用 double (对于第 100 个斐波那契数来说,long 太小了)

  double penultimate = 1; // <- long is not long enough ;) use double or BigInteger
  double ultimate = 1;

  System.out.println(penultimate);

  for (int i = 1; i < 100; ++i) {
    System.out.println(ultimate);

    double h = penultimate + ultimate;
    penultimate = ultimate;
    ultimate = h;
  }
于 2013-07-14T16:23:15.320 回答
0

此外,您可以迭代循环 98 次以获得系列。它会给你最后一个元素Fib[100] = 6174643828739884737

long Fib[] = new long[100];
Fib[0] = 1;
Fib[1] = 1;
int i = 0;
    while(i < 98){
                    Fib[i+2]= Fib[i] + Fib[i+1];
                    System.out.println(Fib[i]);
                    i++;
                }
于 2013-07-14T16:19:47.307 回答