Programa para encontrar el último dígito del enésimo número de Fibonacci

Dado un número ‘n’, escriba una función que imprima el último dígito del n’th (‘n’ también puede ser un número grande) número de Fibonacci. 
Ejemplos: 
 

Input : n = 0
Output : 0

Input: n = 2
Output : 1

Input : n = 7
Output : 3

Método 1: (Método ingenuo) 
El enfoque simple es calcular el n-ésimo número de Fibonacci e imprimir el último dígito. 
 

C++

// 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

// 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

# 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#

// 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
// 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

Javascript

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

Producción: 
 

1
1
3
3

Complejidad: O(Log n).
Limitación de esta implementación: 
los números de Fibonacci crecen exponencialmente rápido. Por ejemplo, el número de Fibonacci número 200 es igual a 280571172992510140037611932413038677189525. Y F(1000) no encaja en el tipo int estándar de C++. 
Para superar esta dificultad, en lugar de calcular el n-ésimo número de Fibonacci, existe un algoritmo directo para calcular simplemente su último dígito (es decir, F(n) mod 10).
Método 2: (Método directo) 
Mire el último dígito en cada número de Fibonacci: el dígito de las unidades:
 

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...

¿Hay un patrón en los dígitos finales?
 

0, 1, 1, 2, 3, 5, 8, 3, 1, 4, 5, 9, 4, 3, 7, 0, 7, ...

¡Sí! 
Pasa un tiempo antes de que se note. De hecho, la serie tiene solo 60 números y luego repite la misma secuencia una y otra vez a lo largo de la serie de Fibonacci, para siempre. La serie de dígitos finales se repite con una longitud de ciclo de 60 (consulte esto para obtener explicaciones de este resultado).
Entonces, en lugar de calcular el número de Fibonacci una y otra vez, calcule previamente el dígito de las unidades de los primeros 60 números de Fibonacci y guárdelo en una array y use los valores de esa array para cálculos posteriores. 
 

C++

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

Java

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

Python3

# 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

C#

// 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

<?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
?>

Javascript

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

Producción: 
 

1
1
3
3

Complejidad: O(1).
Este artículo es una contribución de Rahul Agrawal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *