您将得到两个正数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