Fibonacci计算器与BigIntegers

我正在做一个家庭作业项目,我必须让用户输入一个数字,然后计算机将斐波纳契数字吐出一个。 我通常可以用int值来做到这一点,除了对于这个程序,我需要使用BigInteger类型,因为int,long,double等类型太小而不能保存我需要的值。 所以,这是我得到的代码。 问题是它不打印它应该的数字。 我的import:

import java.math.*; import java.util.Scanner; 

其余的代码:

  public static void main(String args[]) { //input to print Fibonacci series up to how many numbers System.out.println("Enter number up to which Fibonacci series to print: "); BigInteger i = BigInteger.valueOf(new Scanner(System.in).nextLong()); System.out.println("First " + i + " Fibonacci numbers: "); //printing Fibonacci series upto number for(int j=1; i.compareTo(BigInteger.valueOf(j))<0; j++){ System.out.print(fibonacci2(BigInteger.valueOf(j)) +" "); } } public static BigInteger fibonacci2(BigInteger number){ if(number.compareTo(BigInteger.valueOf(1)) == 0 || number.compareTo(BigInteger.valueOf(2)) == 0){ return BigInteger.valueOf(1); } BigInteger fibo1=BigInteger.valueOf(1), fibo2=BigInteger.valueOf(1), fibonacci=BigInteger.valueOf(1); for(int i=3; number.compareTo(BigInteger.valueOf(i))<=0; i++){ //Fibonacci number is sum of previous two Fibonacci number fibonacci = fibonacci.add(fibo1.add(fibo2)); fibo1 = fibo2; fibo2 = fibonacci; } return fibonacci; //The current Fibonacci number } } 

我知道它应该工作,因为我能够使用它与int类型,但后来我开始需要更大的值,所以我被迫进入BigInteger。 有人能看出它有什么问题吗? 我认为问题在于对fibonacci2方法的回报。

return值是需要是BigInteger ,而不是您的参数number 。 您的初始测试是12 (不是01 – 这是开发人员的计算方式)。 基本上,快速而肮脏的解决方案就像

 public static BigInteger fibonacci2(int n) { if (n == 0 || n == 1) { return BigInteger.ONE; } return fibonacci2(n - 2).add(fibonacci2(n - 1)); } public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(fibonacci2(i)); } } 

如果你需要计算大值,那么我建议使用类似的memoization

 private static Map memo = new HashMap<>(); public static BigInteger fibonacci3(int n) { if (n == 0 || n == 1) { return BigInteger.ONE; } if (memo.containsKey(n)) { return memo.get(n); } BigInteger v = fibonacci3(n - 2).add(fibonacci3(n - 1)); memo.put(n, v); return v; } 

请注意, fibonacci3将比初始递归版本快得多。