📜  范围内的斐波那契数之和

📅  最后修改于: 2021-04-28 18:10:08             🧑  作者: Mango

给定范围[l,r] ,任务是找到和fib(l)+ fib(l + 1)+ fib(l + 2)+….. + fib(r) ,其中fib(n)n斐波那契数。

例子:

天真的方法:只需以O(r – l)时间复杂度来计算fib(l)+ fib(l + 1)+ fib(l + 2)+….. + fib(r)
为了在O(1)中找到fib(n) ,我们将使用黄金分割率。
使用Binet公式进行斐波那契计算

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define ll long long int
  
// Function to return the nth Fibonacci number
int fib(int n)
{
    double phi = (1 + sqrt(5)) / 2;
    return round(pow(phi, n) / sqrt(5));
}
  
// Function to return the required sum
ll calculateSum(int l, int r)
{
  
    // To store the sum
    ll sum = 0;
  
    // Calculate the sum
    for (int i = l; i <= r; i++)
        sum += fib(i);
  
    return sum;
}
  
// Driver code
int main()
{
    int l = 4, r = 8;
    cout << calculateSum(l, r);
  
    return 0;
}


Java
// Java implementation of the approach
import java.lang.Math;
class GFG
{
      
// Function to return the nth Fibonacci number
static int fib(int n)
{
    double phi = (1 + Math.sqrt(5)) / 2;
    return (int)Math.round(Math.pow(phi, n) / Math.sqrt(5));
}
  
// Function to return the required sum
static int calculateSum(int l, int r)
{
  
    // To store the sum
    int sum = 0;
  
    // Calculate the sum
    for (int i = l; i <= r; i++)
        sum += fib(i);
  
    return sum;
}
  
// Driver code
public static void main(String[] args)
{
    int l = 4, r = 8;
    System.out.println(calculateSum(l, r));
  
}
}
  
//This code is contributed by Code_Mech.


Python3
# Python3 implementation of the approach
  
# Function to return the nth
# Fibonacci number
def fib(n):
    phi = ((1 + (5 ** (1 / 2))) / 2);
    return round((phi ** n) / (5 ** (1 / 2)));
  
# Function to return the required sum
def calculateSum(l, r):
      
    # To store the sum
    sum = 0;
  
    # Calculate the sum
    for i in range(l, r + 1):
        sum += fib(i);
  
    return sum;
  
# Driver Code
if __name__ == '__main__':
    l, r = 4, 8;
    print(calculateSum(l, r));
  
# This code contributed by Rajput-Ji


C#
// C# implemenatation of above approach 
using System;
  
class GFG
{
      
// Function to return the nth Fibonacci number
static int fib(int n)
{
    double phi = (1 + Math.Sqrt(5)) / 2;
    return (int)Math.Round(Math.Pow(phi, n) / Math.Sqrt(5));
}
  
// Function to return the required sum
static int calculateSum(int l, int r)
{
  
    // To store the sum
    int sum = 0;
  
    // Calculate the sum
    for (int i = l; i <= r; i++)
        sum += fib(i);
  
    return sum;
}
  
// Driver code
public static void Main()
{
    int l = 4, r = 8;
    Console.WriteLine(calculateSum(l, r));
}
}
  
/* This code contributed by PrinciRaj1992 */


PHP


C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return the nth Fibonacci number
int fib(int n)
{
    double phi = (1 + sqrt(5)) / 2;
    return round(pow(phi, n) / sqrt(5));
}
  
// Function to return the required sum
int calculateSum(int l, int r)
{
  
    // Using our deduced result
    int sum = fib(r + 2) - fib(l + 1);
    return sum;
}
  
// Driver code
int main()
{
    int l = 4, r = 8;
    cout << calculateSum(l, r);
  
    return 0;
}


Java
// Java implementation of the approach
class GFG 
{
  
// Function to return the nth Fibonacci number
static int fib(int n)
{
    double phi = (1 + Math.sqrt(5)) / 2;
    return (int) Math.round(Math.pow(phi, n) / Math.sqrt(5));
}
  
// Function to return the required sum
static int calculateSum(int l, int r)
{
  
    // Using our deduced result
    int sum = fib(r + 2) - fib(l + 1);
    return sum;
}
  
// Driver code
public static void main(String[] args) 
{
    int l = 4, r = 8;
    System.out.println(calculateSum(l, r));
  
}
}
  
// This code is contributed by 29AjayKumar


Python3
# Python3 implementation of the approach
import math
  
# Function to return the nth 
# Fibonacci number
def fib(n):
  
    phi = (1 + math.sqrt(5)) / 2;
    return int(round(pow(phi, n) / 
                         math.sqrt(5)));
  
# Function to return the required sum
def calculateSum(l, r):
  
    # Using our deduced result
    sum = fib(r + 2) - fib(l + 1);
    return sum;
  
# Driver code
l = 4; 
r = 8;
print(calculateSum(l, r));
  
# This code is contributed by mits


C#
// C# implementation of the approach
using System;
  
class GFG 
{
  
// Function to return the nth Fibonacci number
static int fib(int n)
{
    double phi = (1 + Math.Sqrt(5)) / 2;
    return (int) Math.Round(Math.Pow(phi, n) / 
                            Math.Sqrt(5));
}
  
// Function to return the required sum
static int calculateSum(int l, int r)
{
  
    // Using our deduced result
    int sum = fib(r + 2) - fib(l + 1);
    return sum;
}
  
// Driver code
public static void Main() 
{
    int l = 4, r = 8;
    Console.WriteLine(calculateSum(l, r));
}
}
  
// This code is contributed
// by Akanksha Rai


PHP


输出:
50

高效的方法:想法是找到斐波那契数之和与n斐波那契数之间的关系,并使用Binet公式计算其值。

关系推论

  1. F(i)是第i斐波那契数。
  2. S(i)指直到F(i)的斐波纳契数之和。

所以,
S(n – 1)= F(n + 1)– F(1)
S(n – 1)= F(n + 1)– 1
S(n)= F(n + 2)– 1

为了找到S(n) ,只需计算第(n + 2)斐波那契数,然后从结果中减去1
所以,
S(l,r)= S(r)– S(l – 1)
S(l,r)= F(r + 2)– 1 –(F(l + 1)– 1)
S(l,r)= F(r + 2)– F(l + 1)

C++

// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return the nth Fibonacci number
int fib(int n)
{
    double phi = (1 + sqrt(5)) / 2;
    return round(pow(phi, n) / sqrt(5));
}
  
// Function to return the required sum
int calculateSum(int l, int r)
{
  
    // Using our deduced result
    int sum = fib(r + 2) - fib(l + 1);
    return sum;
}
  
// Driver code
int main()
{
    int l = 4, r = 8;
    cout << calculateSum(l, r);
  
    return 0;
}

Java

// Java implementation of the approach
class GFG 
{
  
// Function to return the nth Fibonacci number
static int fib(int n)
{
    double phi = (1 + Math.sqrt(5)) / 2;
    return (int) Math.round(Math.pow(phi, n) / Math.sqrt(5));
}
  
// Function to return the required sum
static int calculateSum(int l, int r)
{
  
    // Using our deduced result
    int sum = fib(r + 2) - fib(l + 1);
    return sum;
}
  
// Driver code
public static void main(String[] args) 
{
    int l = 4, r = 8;
    System.out.println(calculateSum(l, r));
  
}
}
  
// This code is contributed by 29AjayKumar

Python3

# Python3 implementation of the approach
import math
  
# Function to return the nth 
# Fibonacci number
def fib(n):
  
    phi = (1 + math.sqrt(5)) / 2;
    return int(round(pow(phi, n) / 
                         math.sqrt(5)));
  
# Function to return the required sum
def calculateSum(l, r):
  
    # Using our deduced result
    sum = fib(r + 2) - fib(l + 1);
    return sum;
  
# Driver code
l = 4; 
r = 8;
print(calculateSum(l, r));
  
# This code is contributed by mits

C#

// C# implementation of the approach
using System;
  
class GFG 
{
  
// Function to return the nth Fibonacci number
static int fib(int n)
{
    double phi = (1 + Math.Sqrt(5)) / 2;
    return (int) Math.Round(Math.Pow(phi, n) / 
                            Math.Sqrt(5));
}
  
// Function to return the required sum
static int calculateSum(int l, int r)
{
  
    // Using our deduced result
    int sum = fib(r + 2) - fib(l + 1);
    return sum;
}
  
// Driver code
public static void Main() 
{
    int l = 4, r = 8;
    Console.WriteLine(calculateSum(l, r));
}
}
  
// This code is contributed
// by Akanksha Rai

的PHP


输出:
50