📜  GCD和斐波那契数

📅  最后修改于: 2021-05-04 17:19:23             🧑  作者: Mango

您将得到两个正数M和N。任务是打印第M个和第N个斐波那契数的最大公约数。
前几个斐波那契数是0、1、1、2、3、5、8、13、21、34、55、89、144,…。
请注意,0被视为第0个斐波那契数。
例子:

Input  : M = 3, N = 6
Output :  2
Fib(3) = 2, Fib(6) = 8
GCD of above two numbers is 2

Input  : M = 8, N = 12
Output :  3
Fib(8) = 21, Fib(12) = 144
GCD of above two numbers is 3

一个简单的解决方案是按照以下步骤。
1)找到第M个斐波那契数。
2)找到第N个斐波那契数。
3)返回两个数字的GCD。
更好的解决方案基于以下身份

GCD(Fib(M), Fib(N)) = Fib(GCD(M, N))

The above property holds because Fibonacci Numbers follow
Divisibility Sequence, i.e., if M divides N, then Fib(M)
also divides N. For example, Fib(3) = 2 and every third
third Fibonacci Number is even.

Source : Wiki

这些步骤是:
1)找到M和N的GCD。令GCD为g。
2)返回Fib(g)。
以下是上述想法的实现。

C++
// C++ Program to find GCD of Fib(M) and Fib(N)
#include 
using namespace std;
const int MAX = 1000;
 
// Create an array for memoization
int f[MAX] = {0};
 
// Returns n'th Fibonacci number using table f[].
// Refer method 6 of below post for details.
// https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
int fib(int n)
{
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
 
    // If fib(n) is already computed
    if (f[n])
        return f[n];
 
    int k = (n & 1)? (n+1)/2 : n/2;
 
    // Applying recursive formula [Note value n&1 is 1
    // if n is odd, else 0.
    f[n] = (n & 1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1))
           : (2*fib(k-1) + fib(k))*fib(k);
 
    return f[n];
}
 
// Function to return gcd of a and b
int gcd(int M, int N)
{
    if (M == 0)
        return N;
    return gcd(N%M, M);
}
 
// Returns GCD of Fib(M) and Fib(N)
int findGCDofFibMFibN(int M,  int N)
{
    return fib(gcd(M, N));
}
 
// Driver code
int main()
{
   int M = 3, N = 12;
   cout << findGCDofFibMFibN(M, N);
   return 0;
}


Java
// Java Program to find GCD of Fib(M) and Fib(N)
class gcdOfFibonacci
{
    static final int MAX = 1000;
    static int[] f;
 
    gcdOfFibonacci()  // Constructor
    {
        // Create an array for memoization
        f = new int[MAX];
    }
 
    // Returns n'th Fibonacci number using table f[].
    // Refer method 6 of below post for details.
    // https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
    private static int fib(int n)
    {
        // Base cases
        if (n == 0)
            return 0;
        if (n == 1 || n == 2)
            return (f[n] = 1);
 
        // If fib(n) is already computed
        if (f[n]!=0)
            return f[n];
 
        int k = ((n & 1)==1)? (n+1)/2 : n/2;
 
        // Applying recursive formula [Note value n&1 is 1
        // if n is odd, else 0.
        f[n] = ((n & 1)==1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1))
               : (2*fib(k-1) + fib(k))*fib(k);
 
        return f[n];
    }
 
    // Function to return gcd of a and b
    private static int gcd(int M, int N)
    {
        if (M == 0)
            return N;
        return gcd(N%M, M);
    }
 
    // This method returns GCD of Fib(M) and Fib(N)
    static int findGCDofFibMFibN(int M,  int N)
    {
        return fib(gcd(M, N));
    }
 
    // Driver method
    public static void main(String[] args)
    {
        // Returns GCD of Fib(M) and Fib(N)
        gcdOfFibonacci obj = new gcdOfFibonacci();
        int M = 3, N = 12;
        System.out.println(findGCDofFibMFibN(M, N));
    }
}
// This code is contributed by Pankaj Kumar


Python3
# Python Program to find
# GCD of Fib(M) and Fib(N)
 
MAX = 1000
  
# Create an array for memoization
f=[0 for i in range(MAX)]
  
# Returns n'th Fibonacci
# number using table f[].
# Refer method 6 of below
# post for details.
# https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
def fib(n):
 
    # Base cases
    if (n == 0):
        return 0
    if (n == 1 or n == 2):
        f[n] = 1
  
    # If fib(n) is already computed
    if (f[n]):
        return f[n]
  
    k = (n+1)//2 if(n & 1) else n//2
  
    # Applying recursive
    # formula [Note value n&1 is 1
    # if n is odd, else 0.
    f[n] = (fib(k)*fib(k) + fib(k-1)*fib(k-1)) if(n & 1) else ((2*
           fib(k-1) + fib(k))*fib(k))
  
    return f[n]
 
  
# Function to return
# gcd of a and b
def gcd(M, N):
 
    if (M == 0):
        return N
    return gcd(N % M, M)
 
  
# Returns GCD of
# Fib(M) and Fib(N)
def findGCDofFibMFibN(M, N):
 
    return fib(gcd(M, N))
 
  
# Driver code
 
M = 3
N = 12
 
print(findGCDofFibMFibN(M, N))
 
# This code is contributed
# by Anant Agarwal.


C#
// C# Program to find GCD of
// Fib(M) and Fib(N)
using System;
 
class gcdOfFibonacci {
     
    static int MAX = 1000;
    static int []f;
 
    // Constructor
    gcdOfFibonacci()
    {
        // Create an array
        // for memoization
        f = new int[MAX];
    }
 
    // Returns n'th Fibonacci number
    // using table f[]. Refer method
    // 6 of below post for details.
    // https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
    private static int fib(int n)
    {
        // Base cases
        if (n == 0)
            return 0;
        if (n == 1 || n == 2)
            return (f[n] = 1);
 
        // If fib(n) is
        // already computed
        if (f[n]!=0)
            return f[n];
 
        int k = ((n & 1)==1)? (n+1)/2 : n/2;
 
        // Applying recursive formula
        // [Note value n&1 is 1
        // if n is odd, else 0.
        f[n] = ((n & 1) == 1) ? (fib(k) * fib(k) +
               fib(k - 1) * fib(k - 1)) :
               (2 * fib(k - 1) + fib(k)) * fib(k);
 
        return f[n];
    }
 
    // Function to return gcd of a and b
    private static int gcd(int M, int N)
    {
        if (M == 0)
            return N;
        return gcd(N%M, M);
    }
 
    // This method returns GCD of
    // Fib(M) and Fib(N)
    static int findGCDofFibMFibN(int M, int N)
    {
        return fib(gcd(M, N));
    }
 
    // Driver method
    public static void Main()
    {
        // Returns GCD of Fib(M) and Fib(N)
        new gcdOfFibonacci();
        int M = 3, N = 12;
        Console.Write(findGCDofFibMFibN(M, N));
    }
}
 
// This code is contributed by nitin mittal.


PHP


Javascript


输出:

2