Count composite fibonacci numbers from given array
Given an array arr[] of size N, the task is to find the composite Fibonacci numbers present in the given array.
Examples:
Input: arr[] = {13, 55, 7, 3, 5, 21, 233, 144, 6}
Output: 55 21 144
Explanation:
Composite array elements are {55, 21, 144, 6}.
Fibonacci array elements are {55, 21, 144}.
Therefore, array elements which are both composite as well as Fibonacci are {55, 21, 144}.Input: arr[] = {34, 13, 11, 8, 3, 55, 233}
Output: 3
Explanation:
Composite array elements are {34, 8, 55}
Fibonacci array elements are {34, 8, 55}
Therefore, array elements which are both composite as well as Fibonacci are {34, 8, 55}.
Approach: Follow the steps below to solve the problem:
- Initialize a variable, say Max to store the largest element of the array.
- Create a Set to store all Fibonacci numbers up to Max.
- Initialize an array, say sieve[], to store all the prime numbers using Sieve Of Eratosthenes.
- Finally, traverse the array and check if the current array element is both composite and Fibonacci number or not. If found to be true, then print the current element.
Below is the implementation of the above approach:
- C++
- Java
- Python3
- C#
- Javascript
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to find all Fibonacci // numbers up to Max set< int > createhashmap( int Max) { // Store all Fibonacci numbers // upto Max set< int > hashmap; // Stores previous element // of Fibonacci sequence int curr = 1; // Stores previous element // of Fibonacci sequence int prev = 0; // Insert prev into hashmap hashmap.insert(prev); // Insert all the Fibonacci // numbers up to Max while (curr <= Max) { // Insert curr into hashmap hashmap.insert(curr); // Stores curr into temp int temp = curr; // Update curr curr = curr + prev; // Update prev prev = temp; } return hashmap; } // Function to find all Composite // numbers up to Max vector< bool > SieveOfEratosthenes( int Max) { // isPrime[i]: Stores if i is // a prime number or not vector< bool > isPrime(Max, true ); isPrime[0] = false ; isPrime[1] = false ; // Calculate all prime numbers up to // Max using Sieve of Eratosthenes for ( int p = 2; p * p <= Max; p++) { // If P is a prime number if (isPrime[p]) { // Set all multiple of P // as non-prime for ( int i = p * p; i <= Max; i += p) { // Update isPrime isPrime[i] = false ; } } } return isPrime; } // Function to find the numbers which is // both a composite and Fibonacci number int cntFibonacciPrime( int arr[], int N) { // Stores the largest element // of the array int Max = arr[0]; // Traverse the array arr[] for ( int i = 1; i < N; i++) { // Update Max Max = max(Max, arr[i]); } // isPrim[i] check i is // a prime number or not vector< bool > isPrime = SieveOfEratosthenes(Max); // Stores all the Fibonacci numbers set< int > hashmap = createhashmap(Max); // Traverse the array arr[] for ( int i = 0; i < N; i++) { // current element is not // a composite number if (arr[i] == 1) continue ; // If current element is a Fibonacci // and composite number if ((hashmap.count(arr[i])) && !isPrime[arr[i]]) { // Print current element cout << arr[i] << " " ; } } } // Driver Code int main() { int arr[] = { 13, 55, 7, 3, 5, 21, 233, 144, 89 }; int N = sizeof (arr) / sizeof (arr[0]); cntFibonacciPrime(arr, N); return 0; } |
Java
Python3
C#
Javascript
55 21 144
Time Complexity: O(N + Max * log(log(Max))), where Max is the largest element in the array
Auxiliary Space: O(N)