Fibonacci计算器与BigIntegers

时间:2015-04-14 00:41:53

标签: java biginteger fibonacci

我正在做一个家庭作业项目,我必须让用户输入一个数字,然后计算机会将斐波那契数字吐出来。我通常能够使用int值执行此操作,但对于此程序,我需要使用BigInteger类型,因为int,long,double等类型太小而无法保存值I&# 39;我需要。所以,这是我得到的代码。问题是它没有打印出它应该的数字。 我的进口商品:

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方法的回报。

1 个答案:

答案 0 :(得分:2)

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<Integer, BigInteger> 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将明显快于初始递归版本。