簡體   English   中英

大斐波那契數的最后一位快速算法

[英]Last Digit of a Large Fibonacci Number fast algorithm

我正在嘗試使用 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 秒。

我不得不使用 big Integer 因為 long 還不夠。

斐波那契數列的最后一位有一個循環。 每 60 個數字重復一次。 因此,只需建立一個前 60 個數字的最后一位數字的表格,然后對輸入進行模 60 運算和查表。

您可以在任何在線(或離線)斐波那契數表中看到周期。 一個鏈接在底部。

對於建表,對於每個計算出的數字,如果超過 9,您可以減去 10,因為您只需要最后一位數字,並且每個數字的最后一位數字僅取決於前兩個數字的最后一位數字。 您可以使用int math(您既不需要long也不需要BigInteger )。

鏈接: 前 300 個斐波那契數,因數分解

您的實現確實很幼稚,因為您被要求獲取斐波那契數的最后一位數字,而不是實際的斐波那契數本身。 您只需要跟蹤最后一位數字,其他數字無關緊要。

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;
}

這里我附上一個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;
}

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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM