大型Fibonacci数的快速算法的最后一位数字

时间:2019-02-01 13:15:15

标签: java algorithm fibonacci biginteger

我正在尝试使用Java解决斐波那契问题,但是我的代码花费大量时间如此长。

问题描述 任务。给定一个整数,找到th斐波那契数的最后一位(即mod 10)。

输入格式。输入由单个整数组成。

约束。 0 ≤ ≤ 10⁷.

输出格式。输出的最后一位。

我的代码:

public class FibonacciLastDigit {

private static int getFibonacciLastDigitNaive(int n) {
    if (n <= 1) {
        return n;
    }
    BigInteger first = BigInteger.ZERO;
    BigInteger second = BigInteger.ONE;
    BigInteger temp;

    for (int i = 1; i < n; i++) {
        temp = first.add(second);
        first = second;
        second = temp;
    }
    return second.mod(BigInteger.TEN).intValue();
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    System.out.println(getFibonacciLastDigitNaive(n));
}}

如果输入= 613455,我的代码将失败,它需要30秒才能获取值,并且最大允许时间为1.5秒。

由于时间不够,我不得不使用大整数。

4 个答案:

答案 0 :(得分:9)

您的实现确实是天真的,因为要求您获取斐波那契数字的最后一位而不是实际的斐波那契数字本身。您只需要跟踪最后一位数字,其他数字就无关紧要。

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    System.out.println(getFibonacciLastDigit(n));
}

private static int getFibonacciLastDigit(int n) {
    if (n <= 1) {
        return n;
    }
    int first = 0;
    int second = 1;
    int temp;

    for (int i = 1; i < n; i++) {
        temp = (first + second) % 10;
        first = second;
        second = temp;
    }
    return second;
}

答案 1 :(得分:8)

斐波纳契数的最后一位有一个循环。每60个数字重复一次。因此,只需建立前60个数字的最后一个数字的表,然后对输入进行60模​​运算并进行表查找即可。

您可能会在任何在线(或离线)斐波那契数字中看到周期。底部有一个链接。

要构建表格,对于每个计算出的数字,如果它超过9,则可以减去10,因为您只需要最后一位数字,并且每个数字的最后一位数字仅取决于前两个数字的最后一位数字。您可以使用int数学(既不需要long也不需要BigInteger)。

链接:The first 300 Fibonacci numbers, factored

答案 2 :(得分:0)

这里我附上一个c++程序,可以使用逻辑在java中编写程序。通过这段代码,我们只需要找到第 60 个斐波那契数。而且这会执行得非常快,也不需要持有大量的数字。

#include <iostream>

using namespace std;

long long int findOutTheFibonacciNumber(int n)
{
    int number = n % 60;
    if (number <= 1)
    {
        return number;
    }
    else
    {
        long long int a = 0;
        long long int b = 1;
        long long int c = 1;
        for (int i = 2; i <= number; i++)
        {
            c = (long long)a + b;
            a = b;
            b = c;
        }
        return c % 10;
    }
}

int main()
{
    int n;
    cin >> n;
    cout << findOutTheFibonacciNumber(n);
    return 0;
}

答案 3 :(得分:-1)

您的实现确实很幼稚,因为要求您获取斐波那契数字的最后一位而不是实际的斐波那契数字本身。您只需要跟踪最后一位数字,其他数字无关紧要。 py中的代码必须为

lookup = {0:0,1:1}
N = int(input())
for i in range(2,N+1):
       lookup[i] = (lookup[i-1] + lookup[i-1])%10
print(lookup[N])