给定N个斐波纳契数的索引。任务是找到给定索引处的斐波那契数的GCD。
前几个斐波那契数是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…
注意:索引从零开始。也就是说,第0个斐波那契数= 0。
例子:
Input: Indices = {2, 3, 4, 5}
Output: GCD of the fibonacci numbers = 1
Input: Indices = {3, 6, 9}
Output: GCD of the fibonacci numbers = 2
蛮力方法:蛮力解决方案是找到给定索引上存在的所有斐波那契数,并计算所有这些数的GCD,然后打印结果。
高效的方法:高效的方法是使用该属性:
GCD(Fib(M), Fib(N)) = Fib(GCD(M, N))
想法是计算所有索引的GCD,然后在索引gcd_1(其中gcd_1是给定索引的GCD)处找到斐波那契数。
下面是上述方法的实现:
C++
// C++ program to Find the GCD of N Fibonacci
// Numbers with given Indices
#include
using namespace std;
// Function to return n'th
// Fibonacci number
int getFib(int n)
{
/* Declare an array to store Fibonacci numbers. */
int f[n + 2]; // 1 extra to handle case, n = 0
int i;
// 0th and 1st number of the series
// are 0 and 1
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++) {
// Add the previous 2 numbers in the series
// and store it
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
// Function to Find the GCD of N Fibonacci
// Numbers with given Indices
int find(int arr[], int n)
{
int gcd_1 = 0;
// find the gcd of the indices
for (int i = 0; i < n; i++) {
gcd_1 = __gcd(gcd_1, arr[i]);
}
// find the fibonacci number at
// index gcd_1
return getFib(gcd_1);
}
// Driver code
int main()
{
int indices[] = { 3, 6, 9 };
int N = sizeof(indices) / sizeof(int);
cout << find(indices, N);
return 0;
}
Java
// Java program to Find the GCD of N Fibonacci
// Numbers with given Indices
import java.io.*;
// Function to return n'th
// Fibonacci number
public class GFG {
// Recursive function to return gcd of a and b
static int __gcd(int a, int b)
{
// Everything divides 0
if (a == 0)
return b;
if (b == 0)
return a;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
static int getFib(int n)
{
/* Declare an array to store Fibonacci numbers. */
int f[] = new int[n + 2];
// 1 extra to handle case, n = 0
int i;
// 0th and 1st number of the series
// are 0 and 1
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++) {
// Add the previous 2 numbers in the series
// and store it
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
// Function to Find the GCD of N Fibonacci
// Numbers with given Indices
static int find(int arr[], int n)
{
int gcd_1 = 0;
// find the gcd of the indices
for (int i = 0; i < n; i++) {
gcd_1 = __gcd(gcd_1, arr[i]);
}
// find the fibonacci number at
// index gcd_1
return getFib(gcd_1);
}
// Driver code
public static void main (String[] args) {
int indices[] = { 3, 6, 9 };
int N = indices.length;
System.out.println( find(indices, N));
}
}
Python 3
# Python program to Find the
# GCD of N Fibonacci Numbers
# with given Indices
from math import *
# Function to return n'th
# Fibonacci number
def getFib(n) :
# Declare an array to store
# Fibonacci numbers.
f = [0] * (n + 2) # 1 extra to handle case, n = 0
# 0th and 1st number of the
# series are 0 and 1
f[0], f[1] = 0, 1
# Add the previous 2 numbers
# in the series and store it
for i in range(2, n + 1) :
f[i] = f[i - 1] + f[i - 2]
return f[n]
# Function to Find the GCD of N Fibonacci
# Numbers with given Indices
def find(arr, n) :
gcd_1 = 0
# find the gcd of the indices
for i in range(n) :
gcd_1 = gcd(gcd_1, arr[i])
# find the fibonacci number
# at index gcd_1
return getFib(gcd_1)
# Driver code
if __name__ == "__main__" :
indices = [3, 6, 9]
N = len(indices)
print(find(indices, N))
# This code is contributed by ANKITRAI1
C#
// C# program to Find the GCD
// of N Fibonacci Numbers with
// given Indices
using System;
// Function to return n'th
// Fibonacci number
class GFG
{
// Recursive function to
// return gcd of a and b
static int __gcd(int a, int b)
{
// Everything divides 0
if (a == 0)
return b;
if (b == 0)
return a;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
static int getFib(int n)
{
/* Declare an array to
store Fibonacci numbers. */
int []f = new int[n + 2];
// 1 extra to handle case, n = 0
int i;
// 0th and 1st number of
// the series are 0 and 1
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++)
{
// Add the previous 2 numbers
// in the series and store it
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
// Function to Find the GCD
// of N Fibonacci Numbers
// with given Indices
static int find(int []arr, int n)
{
int gcd_1 = 0;
// find the gcd of the indices
for (int i = 0; i < n; i++)
{
gcd_1 = __gcd(gcd_1, arr[i]);
}
// find the fibonacci number
// at index gcd_1
return getFib(gcd_1);
}
// Driver code
public static void Main ()
{
int []indices = { 3, 6, 9 };
int N = indices.Length;
Console.WriteLine(find(indices, N));
}
}
// This code is contributed
// by Shashank
PHP
Javascript
输出:
2