给定一个正整数 N,任务是找到 F 2 + F 4 + F 6 +………+ F 2n最多 N 项的值,其中 F i表示第 i 个斐波那契数。
斐波那契数是以下整数序列中的数字。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ……
例子:
Input: n = 5
Output: 88
N = 5, So the fibonacci series will be generated from 0th term upto 10th term:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
Sum of elements at even indexes = 0 + 1 + 3 + 8 + 21 + 55
Input: n = 8
Output: 1596
0 + 1 + 3 + 8 + 21 + 55 + 144 + 377 + 987 = 1596.
方法 1:此方法包括通过找到所有 Fibonacci 数直到 2n 并将唯一的偶数索引相加来直接解决问题。但这将需要 O(n) 的时间复杂度。
下面是上述方法的实现:
C++
// C++ Program to find sum
// of even-indiced Fibonacci numbers
#include
using namespace std;
// Computes value of first fibonacci numbers
// and stores the even-indexed sum
int calculateEvenSum(int n)
{
if (n <= 0)
return 0;
int fibo[2 * n + 1];
fibo[0] = 0, fibo[1] = 1;
// Initialize result
int sum = 0;
// Add remaining terms
for (int i = 2; i <= 2 * n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
// For even indices
if (i % 2 == 0)
sum += fibo[i];
}
// Return the alternting sum
return sum;
}
// Driver program to test above function
int main()
{
// Get n
int n = 8;
// Find the even-indiced sum
cout << "Even indexed Fibonacci Sum upto "
<< n << " terms: "
<< calculateEvenSum(n) << endl;
return 0;
}
Java
// Java Program to find sum
// of even-indiced Fibonacci numbers
import java.io.*;
class GFG {
// Computes value of first fibonacci numbers
// and stores the even-indexed sum
static int calculateEvenSum(int n)
{
if (n <= 0)
return 0;
int fibo[] = new int[2 * n + 1];
fibo[0] = 0; fibo[1] = 1;
// Initialize result
int sum = 0;
// Add remaining terms
for (int i = 2; i <= 2 * n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
// For even indices
if (i % 2 == 0)
sum += fibo[i];
}
// Return the alternting sum
return sum;
}
// Driver program
public static void main (String[] args) {
// Get n
int n = 8;
// Find the even-indiced sum
System.out.println("Even indexed Fibonacci Sum upto "
+ n + " terms: "+
+ calculateEvenSum(n));
}
}
// This code is contributed
// by shs
Python 3
# Python3 Program to find sum
# of even-indiced Fibonacci numbers
# Computes value of first fibonacci
# numbers and stores the even-indexed sum
def calculateEvenSum(n) :
if n <= 0 :
return 0
fibo = [0] * (2 * n + 1)
fibo[0] , fibo[1] = 0 , 1
# Initialize result
sum = 0
# Add remaining terms
for i in range(2, 2 * n + 1) :
fibo[i] = fibo[i - 1] + fibo[i - 2]
# For even indices
if i % 2 == 0 :
sum += fibo[i]
# Return the alternting sum
return sum
# Driver code
if __name__ == "__main__" :
# Get n
n = 8
# Find the even-indiced sum
print("Even indexed Fibonacci Sum upto",
n, "terms:", calculateEvenSum(n))
# This code is contributed
# by ANKITRAI1
C#
// C# Program to find sum of
// even-indiced Fibonacci numbers
using System;
class GFG
{
// Computes value of first fibonacci
// numbers and stores the even-indexed sum
static int calculateEvenSum(int n)
{
if (n <= 0)
return 0;
int []fibo = new int[2 * n + 1];
fibo[0] = 0; fibo[1] = 1;
// Initialize result
int sum = 0;
// Add remaining terms
for (int i = 2; i <= 2 * n; i++)
{
fibo[i] = fibo[i - 1] +
fibo[i - 2];
// For even indices
if (i % 2 == 0)
sum += fibo[i];
}
// Return the alternting sum
return sum;
}
// Driver Code
static public void Main ()
{
// Get n
int n = 8;
// Find the even-indiced sum
Console.WriteLine("Even indexed Fibonacci Sum upto " +
n + " terms: " + calculateEvenSum(n));
}
}
// This code is contributed
// by Sach_Code
PHP
Javascript
C++
// C++ Program to find even indexed Fibonacci Sum in
// O(Log n) time.
#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[]
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 above 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];
}
// Computes value of even-indexed Fibonacci Sum
int calculateEvenSum(int n)
{
return (fib(2 * n + 1) - 1);
}
// Driver program to test above function
int main()
{
// Get n
int n = 8;
// Find the alternating sum
cout << "Even indexed Fibonacci Sum upto "
<< n << " terms: "
<< calculateEvenSum(n) << endl;
return 0;
}
Java
// Java Program to find even indexed Fibonacci Sum in
// O(Log n) time.
class GFG {
static int MAX = 1000;
// Create an array for memoization
static int f[] = new int[MAX];
// Returns n'th Fibonacci number
// using table f[]
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] == 1) {
return f[n];
}
int k = (n % 2 == 1) ? (n + 1) / 2 : n / 2;
// Applying above formula [Note value n&1 is 1
// if n is odd, else 0].
f[n] = (n % 2 == 1) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
// Computes value of even-indexed Fibonacci Sum
static int calculateEvenSum(int n) {
return (fib(2 * n + 1) - 1);
}
// Driver program to test above function
public static void main(String[] args) {
// Get n
int n = 8;
// Find the alternating sum
System.out.println("Even indexed Fibonacci Sum upto "
+ n + " terms: "
+ calculateEvenSum(n));
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 Program to find even indexed
# Fibonacci Sum in O(Log n) time.
MAX = 1000;
# Create an array for memoization
f = [0] * MAX;
# Returns n'th Fibonacci number
# using table f[]
def fib(n):
# Base cases
if (n == 0):
return 0;
if (n == 1 or n == 2):
f[n] = 1;
return f[n];
# If fib(n) is already computed
if (f[n]):
return f[n];
k = (n + 1) // 2 if (n % 2 == 1) else n // 2;
# Applying above 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 % 2 == 1) else (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
# Computes value of even-indexed Fibonacci Sum
def calculateEvenSum(n):
return (fib(2 * n + 1) - 1);
# Driver Code
if __name__ == '__main__':
# Get n
n = 8;
# Find the alternating sum
print("Even indexed Fibonacci Sum upto",
n, "terms:", calculateEvenSum(n));
# This code is contributed by PrinciRaj1992
C#
// C# Program to find even indexed Fibonacci Sum in
// O(Log n) time.
using System;
class GFG
{
static int MAX = 1000;
// Create an array for memoization
static int []f = new int[MAX];
// Returns n'th Fibonacci number
// using table f[]
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] == 1)
{
return f[n];
}
int k = (n % 2 == 1) ? (n + 1) / 2 : n / 2;
// Applying above formula [Note value n&1 is 1
// if n is odd, else 0].
f[n] = (n % 2 == 1) ? (fib(k) * fib(k) +
fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
// Computes value of even-indexed Fibonacci Sum
static int calculateEvenSum(int n)
{
return (fib(2 * n + 1) - 1);
}
// Driver code
public static void Main()
{
// Get n
int n = 8;
// Find the alternating sum
Console.WriteLine("Even indexed Fibonacci Sum upto "
+ n + " terms: "
+ calculateEvenSum(n));
}
}
//This code is contributed by 29AjayKumar
Javascript
Even indexed Fibonacci Sum upto 8 terms: 1596
方法 2:
It can be clearly seen that the required sum can be obtained thus:
2 ( F2 + F4 + F6 +………+ F2n ) = (F1 + F2 + F3 + F4 +………+ F2n) – (F1 – F2 + F3 – F4 +………+ F2n)
Now the first term can be obtained if we put 2n instead of n in the formula given here.
Thus F1 + F2 + F3 + F4 +………+ F2n = F2n+2 – 1.
The second term can also be found if we put 2n instead of n in the formula given here
Thus, F1 – F2 + F3 – F4 +………- F2n = 1 + (-1)2n+1F2n-1 = 1 – F2n-1.
So, 2 ( F2 + F4 + F6 +………+ F2n)
= F2n+2 – 1 – 1 + F2n-1
= F2n+2 + F2n-1 – 2
= F2n + F2n+1 + F2n+1 – F2n – 2
= 2 ( F2n+1 -1)
Hence, ( F2 + F4 + F6 +………+ F2n) = F2n+1 -1 .
因此,为了找到所需的总和,任务是仅找到需要 O(log n) 时间的 F 2n+1 。(请参阅本文中的方法 5 或方法 6。
下面是上述方法的实现:
C++
// C++ Program to find even indexed Fibonacci Sum in
// O(Log n) time.
#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[]
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 above 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];
}
// Computes value of even-indexed Fibonacci Sum
int calculateEvenSum(int n)
{
return (fib(2 * n + 1) - 1);
}
// Driver program to test above function
int main()
{
// Get n
int n = 8;
// Find the alternating sum
cout << "Even indexed Fibonacci Sum upto "
<< n << " terms: "
<< calculateEvenSum(n) << endl;
return 0;
}
Java
// Java Program to find even indexed Fibonacci Sum in
// O(Log n) time.
class GFG {
static int MAX = 1000;
// Create an array for memoization
static int f[] = new int[MAX];
// Returns n'th Fibonacci number
// using table f[]
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] == 1) {
return f[n];
}
int k = (n % 2 == 1) ? (n + 1) / 2 : n / 2;
// Applying above formula [Note value n&1 is 1
// if n is odd, else 0].
f[n] = (n % 2 == 1) ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
// Computes value of even-indexed Fibonacci Sum
static int calculateEvenSum(int n) {
return (fib(2 * n + 1) - 1);
}
// Driver program to test above function
public static void main(String[] args) {
// Get n
int n = 8;
// Find the alternating sum
System.out.println("Even indexed Fibonacci Sum upto "
+ n + " terms: "
+ calculateEvenSum(n));
}
}
// This code is contributed by Rajput-Ji
蟒蛇3
# Python3 Program to find even indexed
# Fibonacci Sum in O(Log n) time.
MAX = 1000;
# Create an array for memoization
f = [0] * MAX;
# Returns n'th Fibonacci number
# using table f[]
def fib(n):
# Base cases
if (n == 0):
return 0;
if (n == 1 or n == 2):
f[n] = 1;
return f[n];
# If fib(n) is already computed
if (f[n]):
return f[n];
k = (n + 1) // 2 if (n % 2 == 1) else n // 2;
# Applying above 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 % 2 == 1) else (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
# Computes value of even-indexed Fibonacci Sum
def calculateEvenSum(n):
return (fib(2 * n + 1) - 1);
# Driver Code
if __name__ == '__main__':
# Get n
n = 8;
# Find the alternating sum
print("Even indexed Fibonacci Sum upto",
n, "terms:", calculateEvenSum(n));
# This code is contributed by PrinciRaj1992
C#
// C# Program to find even indexed Fibonacci Sum in
// O(Log n) time.
using System;
class GFG
{
static int MAX = 1000;
// Create an array for memoization
static int []f = new int[MAX];
// Returns n'th Fibonacci number
// using table f[]
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] == 1)
{
return f[n];
}
int k = (n % 2 == 1) ? (n + 1) / 2 : n / 2;
// Applying above formula [Note value n&1 is 1
// if n is odd, else 0].
f[n] = (n % 2 == 1) ? (fib(k) * fib(k) +
fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) * fib(k);
return f[n];
}
// Computes value of even-indexed Fibonacci Sum
static int calculateEvenSum(int n)
{
return (fib(2 * n + 1) - 1);
}
// Driver code
public static void Main()
{
// Get n
int n = 8;
// Find the alternating sum
Console.WriteLine("Even indexed Fibonacci Sum upto "
+ n + " terms: "
+ calculateEvenSum(n));
}
}
//This code is contributed by 29AjayKumar
Javascript
Even indexed Fibonacci Sum upto 8 terms: 1596