I'm trying to solve Fibonacci using java, but my code takes so long with big numbers.
Problem Description
Task. Given an integer π, find the last digit of the πth
Fibonacci number πΉπ
(that is, πΉπ mod 10).
Input Format. The input consists of a single integer π.
Constraints. 0 β€ π β€ 10β·.
Output Format. Output the last digit of πΉπ
.
My code:
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));
}}
My code fails if input = 613455 it takes 30 seconds to get value and max allowed time is 1.5 second.
I had to use big Integer because long isn't enough.
Your implementation is indeed naive, because you're asked to get the last digit of the Fibonacci number not the actual Fibonacci number itself. You only need to keep the track of the last digit, other digits don't matter.
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;
}
There is a cycle in the last digit of the Fibonacci numbers. It repeats for every 60 numbers. So just build a table of the last digit of the first 60 numbers, then do a modulo 60 operation on the input and a table lookup.
You may see the cycle in any online (or offline) table of Fibonacci numbers. One link at the bottom.
For building the table, for each calculated number you may subtract 10 if itβs over 9 since you only need the last digit, and the last digit of each number only depends on the last digit of the two previous numbers. You can use int
math (you neither need long
nor BigInteger
).
Link: The first 300 Fibonacci numbers, factored
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With