[英]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
)。
您的實現確實很幼稚,因為您被要求獲取斐波那契數的最后一位數字,而不是實際的斐波那契數本身。 您只需要跟蹤最后一位數字,其他數字無關緊要。
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.