Skip to content
Related Articles

Related Articles

Pair of fibonacci numbers with a given sum and minimum absolute difference
  • Last Updated : 23 Oct, 2020

Given an integer N(less than 10^6), the task is to find a pair of Fibonacci numbers whose sum is equal to the given N, and the absolute difference between the chosen pair is minimum. 
Print -1 if there is no solution. 
Examples: 

Input: N = 199 
Output: 55 144 
Explanation 
199 can be represented as sum 55 and 144 which has the minimum difference. 
Input: N = 1830 
Output: 233 1597 
Explanation 
1830 can be represented as sum 233 and 1597 which has the minimum difference. 

Approach: The idea is to use hashing to precompute and store the Fibonacci nodes up to the maximum value to make checking easy and efficient (in O(1) time).
After precomputing the hash:  

  1. Start a loop from (N / 2) to 1 (to minimize the absolute difference) and check whether the loop counter ‘i’ and ‘N – i’ are both Fibonacci.
  2. If they are Fibonacci, then we will print them and break out of the loop.
  3. If the number N cannot be represented as the sum of two Fibonacci numbers, then we will print -1.

Below is the implementation of the above approach: 
 

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the pair of
// Fibonacci numbers with a given sum
// and minimum absolute difference
 
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000005
 
// Hash to store all the
// Fibonacci numbers
set<int> fib;
 
// Function to generate fibonacci Series
// and create hash table
// to check Fibonacci numbers
void fibonacci()
{
    // Adding the first two Fibonacci
    // numbers into the Hash set
    int prev = 0, curr = 1, len = 2;
    fib.insert(prev);
    fib.insert(curr);
 
    // Computing the remaining Fibonacci
    // numbers based on the previous
    // two numbers
    while (len <= MAX) {
        int temp = curr + prev;
        fib.insert(temp);
        prev = curr;
        curr = temp;
        len++;
    }
}
 
// Function to find the pair of
// Fibonacci numbers with the given
// sum and minimum absolute difference
void findFibonacci(int N)
{
 
    // Start from N/2 such that the
    // difference between i and
    // N - i will be minimum
    for (int i = N / 2; i > 1; i--) {
 
        // If both 'i' and 'sum - i' are
        // fibonacci numbers then print
        // them and break the loop
        if (fib.find(i) != fib.end()
            && fib.find(N - i) != fib.end()) {
 
            cout << i << " " << (N - i) << endl;
            return;
        }
    }
 
    // If there is no Fibonacci pair
    // possible
    cout << "-1" << endl;
}
 
// Driver code
int main()
{
    // Generate the Fibonacci numbers
    fibonacci();
 
    int sum = 199;
 
    // Find the Fibonacci pair
    findFibonacci(sum);
 
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the pair of
// Fibonacci numbers with a given sum
// and minimum absolute difference
import java.util.*;
  
class GFG{
    // Hash to store all the
    // Fibonacci numbers
    static int MAX=1000005;
    static  Set<Integer> fib=new HashSet<Integer>();
     
    // Function to generate fibonacci Series
    // and create hash table
    // to check Fibonacci numbers
    static void fibonacci()
    {
        // Adding the first two Fibonacci
        // numbers into the Hash set
        int prev = 0, curr = 1, len = 2;
        fib.add(prev);
        fib.add(curr);
     
        // Computing the remaining Fibonacci
        // numbers based on the previous
        // two numbers
        while (len <= MAX) {
            int temp = curr + prev;
            fib.add(temp);
            prev = curr;
            curr = temp;
            len++;
        }
    }
     
    // Function to find the pair of
    // Fibonacci numbers with the given
    // sum and minimum absolute difference
    static void findFibonacci(int N)
    {
     
        // Start from N/2 such that the
        // difference between i and
        // N - i will be minimum
        for (int i = N / 2; i > 1; i--) {
     
            // If both 'i' and 'sum - i' are
            // fibonacci numbers then print
            // them and break the loop
            if (fib.contains(i)  && fib.contains(N - i)) {
     
                System.out.println(i+" "+(N - i));
                return;
            }
        }
     
        // If there is no Fibonacci pair
        // possible
        System.out.println("-1");
    }
     
    // Driver code
    public static void main(String args[])
    {
        // Generate the Fibonacci numbers
        fibonacci();
     
        int sum = 199;
     
        // Find the Fibonacci pair
        findFibonacci(sum);
     
         
    }
}
 
 
// This code is contributed by AbhiThakur

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to find
# the pair of Fibonacci numbers
# with a given sum and minimum
# absolute difference
MAX = 10005
 
# Hash to store all the
# Fibonacci numbers
fib = set()
 
# Function to generate
# fibonacci Series and
# create hash table
# to check Fibonacci
# numbers
def fibonacci():
   
    global fib
    global MAX
     
    # Adding the first
    # two Fibonacci numbers
    # into the Hash set
    prev = 0
    curr = 1
    l = 2
    fib.add(prev)
    fib.add(curr)
 
    # Computing the remaining
    # Fibonacci numbers based
    # on the previous two numbers
    while(l <= MAX):
        temp = curr + prev
        fib.add(temp)
        prev = curr
        curr = temp
        l += 1
 
# Function to find the
# pair of Fibonacci numbers
# with the given sum and
# minimum absolute difference
def findFibonacci(N):
   
    global fib
     
    # Start from N/2 such
    # that the difference
    # between i and N - i
    # will be minimum
    i = N//2
    while(i > 1):
       
        # If both 'i' and 'sum - i'
        # are fibonacci numbers then
        # print them and break the loop
        if (i in fib and
            (N - i) in fib):
            print(i, (N - i))
            return
        i -= 1
 
    # If there is no Fibonacci
    # pair possible
    print("-1")
 
# Driver code
if __name__ == '__main__':
   
    # Generate the Fibonacci
    # numbers
    fibonacci()
    sum = 199
     
    # Find the Fibonacci pair
    findFibonacci(sum)
     
# This code is contributed by bgangwar59

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the pair of
// Fibonacci numbers with a given sum
// and minimum absolute difference
using System;
using System.Collections.Generic;
 
class GFG{
    // Hash to store all the
    // Fibonacci numbers
    static int MAX=100005;
    static  HashSet<int> fib=new HashSet<int>();
      
    // Function to generate fibonacci Series
    // and create hash table
    // to check Fibonacci numbers
    static void fibonacci()
    {
        // Adding the first two Fibonacci
        // numbers into the Hash set
        int prev = 0, curr = 1, len = 2;
        fib.Add(prev);
        fib.Add(curr);
      
        // Computing the remaining Fibonacci
        // numbers based on the previous
        // two numbers
        while (len <= MAX) {
            int temp = curr + prev;
            fib.Add(temp);
            prev = curr;
            curr = temp;
            len++;
        }
    }
      
    // Function to find the pair of
    // Fibonacci numbers with the given
    // sum and minimum absolute difference
    static void findFibonacci(int N)
    {
      
        // Start from N/2 such that the
        // difference between i and
        // N - i will be minimum
        for (int i = N / 2; i > 1; i--) {
      
            // If both 'i' and 'sum - i' are
            // fibonacci numbers then print
            // them and break the loop
            if (fib.Contains(i)  && fib.Contains(N - i)) {
      
                Console.WriteLine(i+" "+(N - i));
                return;
            }
        }
      
        // If there is no Fibonacci pair
        // possible
        Console.WriteLine("-1");
    }
      
    // Driver code
    public static void Main(String []args)
    {
        // Generate the Fibonacci numbers
        fibonacci();
      
        int sum = 199;
      
        // Find the Fibonacci pair
        findFibonacci(sum);
    }
}
 
// This code is contributed by sapnasingh4991

chevron_right


Output: 

55 144


 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :