Given a number ‘n’, write a function that prints the last digit of n’th (‘n’ can also be a large number) Fibonacci number.
Examples :
Input : n = 0 Output : 0 Input: n = 2 Output : 1 Input : n = 7 Output : 3
Method 1 : (Naive Method)
Simple approach is to calculate the n’th Fibonacci number and printing the last digit.
// C++ Program to find last digit // of nth Fibonacci number #include <bits/stdc++.h> using namespace std;
typedef long long int ll;
void multiply(ll F[2][2], ll M[2][2]);
void power(ll F[2][2], ll n);
// Function that returns // nth Fibonacci number ll fib( int n)
{ ll F[2][2] = {{1, 1}, {1, 0}};
if (n == 0)
return 0;
power(F, n - 1);
return F[0][0];
} // Utility method to find // n'th power of F[][] void power(ll F[2][2], ll n)
{ // Base cases
if (n == 0 || n == 1)
return ;
ll M[2][2] = {{1, 1}, {1, 0}};
power(F, n / 2);
multiply(F, F);
if (n % 2 != 0)
multiply(F, M);
} // Utility function to multiply two // matrices and store result in first. void multiply(ll F[2][2], ll M[2][2])
{ ll x = F[0][0] * M[0][0] +
F[0][1] * M[1][0];
ll y = F[0][0] * M[0][1] +
F[0][1] * M[1][1];
ll z = F[1][0] * M[0][0] +
F[1][1] * M[1][0];
ll w = F[1][0] * M[0][1] +
F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
} // Returns last digit of // n'th Fibonacci Number int findLastDigit( int n)
{ return fib(n) % 10;
} // Driver code int main()
{ ll n = 1;
cout << findLastDigit(n) << endl;
n = 61;
cout << findLastDigit(n) << endl;
n = 7;
cout << findLastDigit(n) << endl;
n = 67;
cout << findLastDigit(n) << endl;
return 0;
} |
// Java program to find last digit // of nth Fibonacci number class GFG
{ // Function that returns
// nth Fibonacci number
static long fib( long n)
{
long F[][] = new long [][] {{ 1 , 1 }, { 1 , 0 }};
if (n == 0 )
return 0 ;
power(F, n - 1 );
return F[ 0 ][ 0 ];
}
// Utility function to multiply two
// matrices and store result in first.
static void multiply( long F[][], long M[][])
{
long x = F[ 0 ][ 0 ] * M[ 0 ][ 0 ] +
F[ 0 ][ 1 ] * M[ 1 ][ 0 ];
long y = F[ 0 ][ 0 ] * M[ 0 ][ 1 ] +
F[ 0 ][ 1 ] * M[ 1 ][ 1 ];
long z = F[ 1 ][ 0 ] * M[ 0 ][ 0 ] +
F[ 1 ][ 1 ] * M[ 1 ][ 0 ];
long w = F[ 1 ][ 0 ] * M[ 0 ][ 1 ] +
F[ 1 ][ 1 ] * M[ 1 ][ 1 ];
F[ 0 ][ 0 ] = x;
F[ 0 ][ 1 ] = y;
F[ 1 ][ 0 ] = z;
F[ 1 ][ 1 ] = w;
}
// Optimized version of power() in method 4
static void power( long F[][], long n)
{
if ( n == 0 || n == 1 )
return ;
long M[][] = new long [][] {{ 1 , 1 }, { 1 , 0 }};
power(F, n / 2 );
multiply(F, F);
if (n % 2 != 0 )
multiply(F, M);
}
// Returns last digit of
// n'th Fibonacci Number
long findLastDigit( long n)
{
return (fib(n) % 10 );
}
// Driver code
public static void main(String[] args)
{
int n;
GFG ob = new GFG();
n = 1 ;
System.out.println(ob.findLastDigit(n));
n = 61 ;
System.out.println(ob.findLastDigit(n));
n = 7 ;
System.out.println(ob.findLastDigit(n));
n = 67 ;
System.out.println(ob.findLastDigit(n));
}
} |
# Python3 program to find last digit of # nth Fibonacci number # Function that returns nth Fibonacci number def fib(n):
F = [[ 1 , 1 ], [ 1 , 0 ]];
if (n = = 0 ):
return 0 ;
power(F, n - 1 );
return F[ 0 ][ 0 ];
# Utility function to multiply two # matrices and store result in first. def multiply(F, M):
x = F[ 0 ][ 0 ] * M[ 0 ][ 0 ] + F[ 0 ][ 1 ] * M[ 1 ][ 0 ];
y = F[ 0 ][ 0 ] * M[ 0 ][ 1 ] + F[ 0 ][ 1 ] * M[ 1 ][ 1 ];
z = F[ 1 ][ 0 ] * M[ 0 ][ 0 ] + F[ 1 ][ 1 ] * M[ 1 ][ 0 ];
w = F[ 1 ][ 0 ] * M[ 0 ][ 1 ] + F[ 1 ][ 1 ] * M[ 1 ][ 1 ];
F[ 0 ][ 0 ] = x;
F[ 0 ][ 1 ] = y;
F[ 1 ][ 0 ] = z;
F[ 1 ][ 1 ] = w;
# Optimized version of power() in # method 4 def power(F, n):
if ( n = = 0 or n = = 1 ):
return ;
M = [[ 1 , 1 ], [ 1 , 0 ]];
power(F, int (n / 2 ));
multiply(F, F);
if (n % 2 ! = 0 ):
multiply(F, M);
# Returns last digit of # n'th Fibonacci Number def findLastDigit(n):
return (fib(n) % 10 );
# Driver code n = 1 ;
print (findLastDigit(n));
n = 61 ;
print (findLastDigit(n));
n = 7 ;
print (findLastDigit(n));
n = 67 ;
print (findLastDigit(n));
# This code is contributed # by chandan_jnu |
// C# program to find last digit // of nth Fibonacci number using System;
class GFG
{ // function that returns
// nth Fibonacci number
static long fib( long n)
{
long [,]F = new long [,] {{1, 1}, {1, 0}};
if (n == 0)
return 0;
power(F, n - 1);
return F[0, 0];
}
// Utility function to multiply two
// matrices and store result in first.
static void multiply( long [,]F, long [,]M)
{
long x = F[0, 0] * M[0, 0] +
F[0, 1] * M[1, 0];
long y = F[0, 0] * M[0, 1] +
F[0, 1] * M[1, 1];
long z = F[1, 0] * M[0, 0] +
F[1, 1] * M[1, 0];
long w = F[1, 0] * M[0, 1] +
F[1, 1] * M[1, 1];
F[0, 0] = x;
F[0, 1] = y;
F[1, 0] = z;
F[1, 1] = w;
}
// Optimized version of power() in method 4
static void power( long [,]F, long n)
{
if ( n == 0 || n == 1)
return ;
long [,]M = new long [,] {{1, 1}, {1, 0}};
power(F, n / 2);
multiply(F, F);
if (n % 2 != 0)
multiply(F, M);
}
// Returns last digit of
// n'th Fibonacci Number
static long findLastDigit( long n)
{
return (fib(n) % 10);
}
// Driver code
public static void Main()
{
int n;
n = 1;
Console.WriteLine(findLastDigit(n));
n = 61;
Console.WriteLine(findLastDigit(n));
n = 7;
Console.WriteLine(findLastDigit(n));
n = 67;
Console.WriteLine(findLastDigit(n));
}
} // This code is contributed by Sam007. |
<?php // PHP program to find last digit of nth // Fibonacci number // Function that returns nth Fibonacci number function fib( $n )
{ $F = array ( array (1, 1),
array (1, 0));
if ( $n == 0)
return 0;
power( $F , $n - 1);
return $F [0][0];
} // Utility function to multiply two // matrices and store result in first. function multiply(& $F , & $M )
{ $x = $F [0][0] * $M [0][0] +
$F [0][1] * $M [1][0];
$y = $F [0][0] * $M [0][1] +
$F [0][1] * $M [1][1];
$z = $F [1][0] * $M [0][0] +
$F [1][1] * $M [1][0];
$w = $F [1][0] * $M [0][1] +
$F [1][1] * $M [1][1];
$F [0][0] = $x ;
$F [0][1] = $y ;
$F [1][0] = $z ;
$F [1][1] = $w ;
} // Optimized version of power() in method 4 function power(& $F , $n )
{ if ( $n == 0 || $n == 1)
return ;
$M = array ( array (1, 1), array (1, 0));
power( $F , (int)( $n / 2));
multiply( $F , $F );
if ( $n % 2 != 0)
multiply( $F , $M );
} // Returns last digit of // n'th Fibonacci Number function findLastDigit( $n )
{ return (fib( $n ) % 10);
} // Driver code $n = 1;
echo findLastDigit( $n ) . "\n" ;
$n = 61;
echo findLastDigit( $n ) . "\n" ;
$n = 7;
echo findLastDigit( $n ) . "\n" ;
$n = 67;
echo findLastDigit( $n ) . "\n" ;
// This code is contributed // by Akanksha Rai |
<script> // Javascript program to find last digit of nth Fibonacci number
// Function that returns
// nth Fibonacci number
function fib(n)
{
let F = [[1, 1], [1, 0]];
if (n == 0)
return 0;
power(F, n - 1);
return F[0][0];
}
// Utility function to multiply two
// matrices and store result in first.
function multiply(F, M)
{
let x = F[0][0] * M[0][0] +
F[0][1] * M[1][0];
let y = F[0][0] * M[0][1] +
F[0][1] * M[1][1];
let z = F[1][0] * M[0][0] +
F[1][1] * M[1][0];
let w = F[1][0] * M[0][1] +
F[1][1] * M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
// Optimized version of power() in method 4
function power(F, n)
{
if ( n == 0 || n == 1)
return ;
let M = [[1, 1], [1, 0]];
power(F, parseInt(n / 2, 10));
multiply(F, F);
if (n % 2 != 0)
multiply(F, M);
}
// Returns last digit of
// n'th Fibonacci Number
function findLastDigit(n)
{
return (fib(n) % 10);
}
let n;
n = 1;
document.write(findLastDigit(n) + "</br>" );
n = 61;
document.write(findLastDigit(n) + "</br>" );
n = 7;
document.write(findLastDigit(n) + "</br>" );
n = 67;
document.write(findLastDigit(n));
</script> |
Output:
1 1 3 3
Complexity: O(Log n).
Limitation of this implementation:
Fibonacci numbers grow exponentially fast. For example, the 200’th Fibonacci number equals 280571172992510140037611932413038677189525. And F(1000) does not fit into the standard C++ int type.
To overcome this difficulty, instead of calculating n’th Fibonacci number, there is a direct algorithm to just calculate its last digit (that is, F(n) mod 10).
Method 2 : (Direct Method)
Look at the final digit in each Fibonacci number – the units digit:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...
Is there a pattern in the final digits?
0, 1, 1, 2, 3, 5, 8, 3, 1, 4, 5, 9, 4, 3, 7, 0, 7, ...
Yes!
It takes a while before it is noticeable. In fact, the series is just 60 numbers long and then it repeats the same sequence again and again all the way through the Fibonacci series – for ever. The series of final digits repeats with a cycle length of 60 (Refer this for explanations of this result).
So, instead of calculating the Fibonacci number again and again, pre-compute the units digit of first 60 Fibonacci number and store it in an array and use that array values for further calculations.
// Optimized Program to find last // digit of nth Fibonacci number #include<bits/stdc++.h> using namespace std;
typedef long long int ll;
// Finds nth fibonacci number ll fib(ll f[], ll n) { // 0th and 1st number of
// the series are 0 and 1
f[0] = 0;
f[1] = 1;
// Add the previous 2 numbers
// in the series and store
// last digit of result
for (ll i = 2; i <= n; i++)
f[i] = (f[i - 1] + f[i - 2]) % 10;
return f[n];
} // Returns last digit of n'th Fibonacci Number int findLastDigit( int n)
{ ll f[60] = {0};
// Precomputing units digit of
// first 60 Fibonacci numbers
fib(f, 60);
return f[n % 60];
} // Driver code int main ()
{ ll n = 1;
cout << findLastDigit(n) << endl;
n = 61;
cout << findLastDigit(n) << endl;
n = 7;
cout << findLastDigit(n) << endl;
n = 67;
cout << findLastDigit(n) << endl;
return 0;
} |
// Optimized Java program to find last // digit of n'th Fibonacci number class GFG
{ // Filongs f[] with first
// 60 Fibonacci numbers
void fib( int f[])
{
// 0th and 1st number of
// the series are 0 and 1
f[ 0 ] = 0 ;
f[ 1 ] = 1 ;
// Add the previous 2 numbers
// in the series and store
// last digit of result
for ( int i = 2 ; i <= 59 ; i++)
f[i] = (f[i - 1 ] + f[i - 2 ]) % 10 ;
}
// Returns last digit of n'th Fibonacci Number
int findLastDigit( long n)
{
// In Java, values are 0 by default
int f[] = new int [ 60 ];
// Precomputing units digit of
// first 60 Fibonacci numbers
fib(f);
int index = ( int )(n % 60L);
return f[index];
}
// Driver code
public static void main(String[] args)
{
long n;
GFG ob = new GFG();
n = 1 ;
System.out.println(ob.findLastDigit(n));
n = 61 ;
System.out.println(ob.findLastDigit(n));
n = 7 ;
System.out.println(ob.findLastDigit(n));
n = 67 ;
System.out.println(ob.findLastDigit(n));
}
} |
# Optimized Python3 Program to find last # digit of nth Fibonacci number # Finds nth fibonacci number def fib(f, n):
# 0th and 1st number of
# the series are 0 and 1
f[ 0 ] = 0 ;
f[ 1 ] = 1 ;
# Add the previous 2 numbers
# in the series and store
# last digit of result
for i in range ( 2 , n + 1 ):
f[i] = (f[i - 1 ] + f[i - 2 ]) % 10 ;
return f;
# Returns last digit of n'th # Fibonacci Number def findLastDigit(n):
f = [ 0 ] * 61 ;
# Precomputing units digit of
# first 60 Fibonacci numbers
f = fib(f, 60 );
return f[n % 60 ];
# Driver code n = 1 ;
print (findLastDigit(n));
n = 61 ;
print (findLastDigit(n));
n = 7 ;
print (findLastDigit(n));
n = 67 ;
print (findLastDigit(n));
# This code is contributed # by chandan_jnu |
// Optimized C# program to find last // digit of n'th Fibonacci number using System;
class GFG {
// Filongs f[] with first
// 60 Fibonacci numbers
static void fib( int []f)
{
// 0th and 1st number of
// the series are 0 and 1
f[0] = 0;
f[1] = 1;
// Add the previous 2 numbers
// in the series and store
// last digit of result
for ( int i = 2; i <= 59; i++)
f[i] = (f[i - 1] + f[i - 2]) % 10;
}
// Returns last digit of n'th
// Fibonacci Number
static int findLastDigit( long n)
{
int []f = new int [60];
// Precomputing units digit of
// first 60 Fibonacci numbers
fib(f);
int index = ( int )(n % 60L);
return f[index];
}
// Driver Code
public static void Main()
{
long n;
n = 1;
Console.WriteLine(findLastDigit(n));
n = 61;
Console.WriteLine(findLastDigit(n));
n = 7;
Console.WriteLine(findLastDigit(n));
n = 67;
Console.WriteLine(findLastDigit(n));
}
} // This code is contributed by Sam007 |
<?php // Optimized PHP Program to find last // digit of nth Fibonacci number // Finds nth fibonacci number function fib(& $f , $n )
{ // 0th and 1st number of
// the series are 0 and 1
$f [0] = 0;
$f [1] = 1;
// Add the previous 2 numbers
// in the series and store
// last digit of result
for ( $i = 2; $i <= $n ; $i ++)
$f [ $i ] = ( $f [ $i - 1] +
$f [ $i - 2]) % 10;
return $f [ $n ];
} // Returns last digit of n'th // Fibonacci Number function findLastDigit( $n )
{ $f = array_fill (0, 60, 0);
// Precomputing units digit of
// first 60 Fibonacci numbers
fib( $f , 60);
return $f [ $n % 60];
} // Driver code $n = 1;
print (findLastDigit( $n ) . "\n" );
$n = 61;
print (findLastDigit( $n ) . "\n" );
$n = 7;
print (findLastDigit( $n ) . "\n" );
$n = 67;
print (findLastDigit( $n ) . "\n" );
// This code is contributed // by chandan_jnu ?> |
<script> // Optimized Javascript program to find last
// digit of n'th Fibonacci number
// Filongs f[] with first
// 60 Fibonacci numbers
function fib(f)
{
// 0th and 1st number of
// the series are 0 and 1
f[0] = 0;
f[1] = 1;
// Add the previous 2 numbers
// in the series and store
// last digit of result
for (let i = 2; i <= 59; i++)
f[i] = (f[i - 1] + f[i - 2]) % 10;
}
// Returns last digit of n'th
// Fibonacci Number
function findLastDigit(n)
{
let f = new Array(60);
f.fill(0);
// Precomputing units digit of
// first 60 Fibonacci numbers
fib(f);
let index = (n % 60);
return f[index];
}
let n;
n = 1;
document.write(findLastDigit(n) + "</br>" );
n = 61;
document.write(findLastDigit(n) + "</br>" );
n = 7;
document.write(findLastDigit(n) + "</br>" );
n = 67;
document.write(findLastDigit(n) + "</br>" );
// This code is contributed by divyesh072019
</script> |
Output:
1 1 3 3
Complexity: O(1).