Find the nearest power of 2 for every array element - GeeksforGeeks

07 Apr, 2021
Given an array arr[] of size N, the task is to print the nearest power of 2 for each array element. Note: If there happens to be two nearest powers of 2, consider the larger one.
Examples:
Input: arr[] = {5, 2, 7, 12} Output: 4 2 8 16 Explanation: The nearest power of arr[0] ( = 5) is 4. The nearest power of arr[1] ( = 2) is 2. The nearest power of arr[2] ( = 7) is 8. The nearest power of arr[3] ( = 12) are 8 and 16. Print 16, as it is the largest.
Input: arr[] = {31, 13, 64} Output: 32 16 64
Approach: Follow the steps below to solve the problem:
Traverse the array from left to right.
For every array element, find the nearest powers of 2 greater and smaller than it, i.e. calculate pow(2, log2(arr[i])) and pow(2, log2(arr[i]) + 1).
Calculate difference of these two values from the current array element and print the nearest as specified in the problem statement.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program to implement// the above approach#include <bits/stdc++.h>using namespace std; // Function to find nearest power of two// for every element in the given arrayvoid nearestPowerOfTwo(int arr[], int N){     // Traverse the array    for (int i = 0; i < N; i++) {         // Calculate log of the        // current array element        int lg = log2(arr[i]);        int a = pow(2, lg);        int b = pow(2, lg + 1);         // Find the nearest        if ((arr[i] - a) < (b - arr[i]))            cout << a << " ";        else            cout << b << " ";    }} // Driver Codeint main(){    int arr[] = { 5, 2, 7, 12 };    int N = sizeof(arr) / sizeof(arr[0]);    nearestPowerOfTwo(arr, N);    return 0;}
// Java program to implement the above approachimport java.io.*; class GFG {     // Function to find the nearest power of two    // for every element of the given array    static void nearestPowerOfTwo(int[] arr, int N)    {         // Traverse the array        for (int i = 0; i < N; i++) {             // Calculate log of the            // current array element            int lg = (int)(Math.log(arr[i])                           / Math.log(2));             int a = (int)(Math.pow(2, lg));            int b = (int)(Math.pow(2, lg + 1));             // Find the nearest            if ((arr[i] - a) < (b - arr[i]))                System.out.print(a + " ");            else                System.out.print(b + " ");        }    }     // Driver Code    public static void main(String[] args)    {        int[] arr = { 5, 2, 7, 12 };        int N = arr.length;        nearestPowerOfTwo(arr, N);    }}
# Python program to implement the above approachimport math # Function to find the nearest power# of two for every array elementdef nearestPowerOfTwo(arr, N):     # Traverse the array    for i in range(N):         # Calculate log of current array element        lg = (int)(math.log2(arr[i]))         a = (int)(math.pow(2, lg))        b = (int)(math.pow(2, lg + 1))         # Find the nearest        if ((arr[i] - a) < (b - arr[i])):            print(a, end = " ")        else:            print(b, end = " ")  # Driver Codearr = [5, 2, 7, 12]N = len(arr)nearestPowerOfTwo(arr, N)
// C# program to implement the above approachusing System; class GFG {     // Function to find nearest power of two    // for every array element    static void nearestPowerOfTwo(int[] arr, int N)    {         // Traverse the array        for (int i = 0; i < N; i++) {             // Calculate log of the            // current array element            int lg = (int)(Math.Log(arr[i])                           / Math.Log(2));             int a = (int)(Math.Pow(2, lg));            int b = (int)(Math.Pow(2, lg + 1));             // Find the nearest            if ((arr[i] - a) < (b - arr[i]))                Console.Write(a + " ");            else                Console.Write(b + " ");        }    }     // Driver Code    public static void Main(String[] args)    {        int[] arr = { 5, 2, 7, 12 };        int N = arr.Length;        nearestPowerOfTwo(arr, N);    }}
<script> // JavaScript program to implement// the above approach     // Function to find the nearest power of two    // for every element of the given array    function nearestPowerOfTwo(arr , N) {         // Traverse the array        for (i = 0; i < N; i++) {             // Calculate log of the            // current array element            var lg = parseInt( (Math.log(arr[i]) / Math.log(2)));            var a = parseInt( (Math.pow(2, lg)));            var b = parseInt( (Math.pow(2, lg + 1)));             // Find the nearest            if ((arr[i] - a) < (b - arr[i]))                document.write(a + " ");            else                document.write(b + " ");        }    }     // Driver Code             var arr = [ 5, 2, 7, 12 ];        var N = arr.length;        nearestPowerOfTwo(arr, N); // This code is contributed by todaysgaurav </script>
4 2 8 16
 
 
Time Complexity: O(N) Auxiliary Space: O(1)
 
todaysgaurav
maths-log
maths-power
Arrays
Mathematical
Arrays
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Chocolate Distribution Problem
Count pairs with given sum
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
Program for Fibonacci numbers
Write a program to print all permutations of a given string
Set in C++ Standard Template Library (STL)
C++ Data Types
Coin Change | DP-7