如何确定最大的斐波那契数

时间:2012-11-21 12:01:58

标签: java fibonacci

我被要求确定可以在我的系统上显示的最大的斐波纳契数,我想知道如何做到这一点..

这是我确定第n个斐波纳契数

的简单应用程序
import java.util.Scanner;

public class FibonacciTest
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        System.out.printf("please enter the nth fibonacci number: ");

        int n = input.nextInt();
        System.out.printf("%d\n", fibonacci(n));

    }// end main

    public static int fibonacci(int n)
    {
        // determines nth fibonacci number
        int fib = 1;
        int temp = 0;

        if (n == 1)
            return 0;

        else
        {
            for (int i = 2; i < n; i++)
            {
                int last = fib;
                fib += temp;
                temp = last;
            }
            return fib;
        }

    }// end fibonacci
}

4 个答案:

答案 0 :(得分:7)

  

确定可在我的系统上显示的最大斐波那契数

为此您需要使用BigInteger

运行此操作直到您的应用程序停止,因为资源已耗尽。

public static void main(String... args) {
    BigInteger a = BigInteger.ONE;
    BigInteger b = BigInteger.ONE;
    String last = null;
    try {
        for (long count = 1; ; count++) {
            BigInteger c = a.add(b);
            last = c.toString();
            a = b;
            b = c;
            if (count % 10000 == 0)
                System.out.println("... " + count);
        }
    } catch (Throwable e) {
        System.out.println("The largest value which was calculated was");
        System.out.println(last);
    }
}

我会首先尝试使用少量内存,例如-mx16m

更新:即使限制为16 MB,它也计算了13K项并仍在运行。

答案 1 :(得分:5)

Java中最大的int斐波纳契数:

public class FibonacciTest
{
    public static void main(String[] args)
    {
        System.out.printf("%d\n", largestFibonacciInt());
    }

    public static int largestFibonacciInt()
    {
        int temp;
        int last = 1;
        int fib = 1;

        while (fib + last > fib) {
            temp = fib;
            fib += last;
            last = temp;
        }

        return fib;
    }
}

您也可以使用long执行此操作,只需替换int的所有匹配项。

答案 2 :(得分:2)

如果您的目标是找到可以在Java中表示为int的最大斐波那契数,您可以直接计算下一个数字,直到它溢出:

public static void main(String[] args) {
    System.out.println("Largest integer Fibonacci number: " + maxFibonacci());
}

public static int maxFibonacci() {
    int n = Integer.MAX_VALUE;
    int fib = 1;
    int temp = 0;

    for (int i = 2; i < n; i++) {
        int last = fib;
        fib += temp;
        if (fib < 0) return last; //overflow, we are done
        temp = last;
    }
    return 0; //unreachable
}

很明显,您的系统可以计算更高的数字,例如使用BigInteger。在这种情况下,限制将是以下之一:

  • 处理时间
  • 可用内存或
  • (如果你有大量的内存和很多时间)BigInteger的限制,它由int[]支持,因此限制为2 ^ 31的数组大小。

最后,值得一提的是,您的问题可以通过数学方法更好地解决。

如果您需要找到小于某个数字N的最大斐波纳契数,您还可以使用the rounding calculation

phi^n / sqrt(5) < N

给你:

n < log(N x sqrt(5)) / log(phi)

然后,您可以计算所选N的右侧部分,将其向下舍入以查找n,并计算相应的斐波纳契数:

F(n) = floor(phi^n / sqrt(5))

答案 3 :(得分:0)

您可以计算100K甚至更多。 对于计算机中的100k,计算结果只需1.4s。

private static final Map<Integer, BigInteger> fbNumbers = new HashMap<>();

public static void main(String[] args) {
    fbNumbers.put(0, BigInteger.valueOf(1));
    fbNumbers.put(1, BigInteger.valueOf(1));
    long start = System.currentTimeMillis();
    System.out.println(fbCalculationForBigNumbers(100000));
    System.out.println(String.format("%d ms", System.currentTimeMillis() - start));
}

private static BigInteger fbCalculationForBigNumbers(int num) {
    return IntStream.rangeClosed(0, num).mapToObj(i -> fbCalculation(i)).max((x,y) -> x.compareTo(y)).get();
}

private static BigInteger fbCalculation(int num) {

    if (fbNumbers.containsKey(num)) {
        return fbNumbers.get(num);
    }

    BigInteger result = fbCalculation(num - 1).add(fbCalculation(num - 2));
    fbNumbers.put(num, result);
    return result;

}