Skip to content
Related Articles

Related Articles

Improve Article

Nearest smaller power of 2 for every digit of a number

  • Last Updated : 03 May, 2021

Given an integer num, the task for every digit of the number is to find the highest power of 2 not exceeding that digit.

Examples:

Input: num = 4317
Output: 4214
Explanation: 
The highest power of 2 ≤ 4 is 4.
The highest power of 2 ≤ 3 is 2.
The highest power of 2 ≤ 1 is 1.
The highest power of 2 ≤ 7 is 4.

Input: num = 8015
Output: 8014

Approach: Follow the steps below to solve the problem:



  1. Convert the number to its equivalent string.
  2. Traverse the string.
  3. If the digit is ‘0’, print 0.
  4. Otherwise, for every digit x, calculate 2(log2(x)).

Below is the implementation of the above approach:

C++




// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the nearest power of
// two for every digit of a given number
void highestPowerOfTwo(int num)
{
    // Converting number to string
    string s = to_string(num);
 
    // Traverse the array
    for (int i = 0; i < (int)s.size();
         i++) {
 
        if (s[i] == '0') {
            cout << "0";
            continue;
        }
 
        // Calculate log base 2
        // of the current digit s[i]
        int lg = log2(int(s[i]) - 48);
 
        // Highest power of 2 <= s[i]
        int p = pow(2, lg);
 
        // ASCII conversion
        cout << char(p + 48);
    }
}
 
// Driver Code
int main()
{
    int num = 4317;
    highestPowerOfTwo(num);
 
    return 0;
}

Java




// Java program to implement
// the above approach
import java.util.*;
class GFG
{
 
  // Function to find the nearest power of
  // two for every digit of a given number
  static void highestPowerOfTwo(int num)
  {
 
    // Converting number to string
    String s = Integer.toString(num);
 
    // Traverse the array
    for (int i = 0; i < (int)s.length(); i++)
    {
 
      if (s.charAt(i) == '0')
      {
        System.out.print("0");
        continue;
      }
 
      // Calculate log base 2
      // of the current digit s[i]
      int lg
        = (int)(Math.log(s.charAt(i) - '0') / Math.log(2));
 
      // Highest power of 2 <= s[i]
      int p = (int)Math.pow(2, lg);
 
      // ASCII conversion
      System.out.print((char)(p + 48));
    }
  }
 
  // Driver Code
  public static void main(String args[])
  {
    int num = 4317;
    highestPowerOfTwo(num);
  }
}
 
// This code is contributed by susmitakundugoaldanga.

Python3




# Python 3 program for the above approach
import math
 
# Function to find the nearest power of
# two for every digit of a given number
def highestPowerOfTwo(num) :
     
    # Converting number to string
    s = str(num)
 
    # Traverse the array
    for i in range(len(s)):
        if (s[i] == '0') :
            print("0")
            continue
         
        # Calculate log base 2
        # of the current digit s[i]
        lg = int(math.log2(ord(s[i]) - 48))
 
        # Highest power of 2 <= s[i]
        p = pow(2, lg)
 
        # ASCII conversion
        print(chr(p + 48), end = "")
     
# Driver Code
num = 4317
highestPowerOfTwo(num)
 
# This code is contributed by code_hunt.

C#




// C# program to implement
// the above approach
using System;
class GFG
{
 
    // Function to find the nearest power of
    // two for every digit of a given number
    static void highestPowerOfTwo(int num)
    {
        // Converting number to string
        String s = num.ToString();
 
        // Traverse the array
        for (int i = 0; i < (int)s.Length; i++)
        {
 
            if (s[i] == '0')
            {
                Console.Write("0");
                continue;
            }
 
            // Calculate log base 2
            // of the current digit s[i]
            int lg
                = (int)(Math.Log(s[i] - '0') / Math.Log(2));
 
            // Highest power of 2 <= s[i]
            int p = (int)Math.Pow(2, lg);
 
            // ASCII conversion
            Console.Write((char)(p + 48));
        }
    }
 
    // Driver Code
    public static void Main()
    {
        int num = 4317;
        highestPowerOfTwo(num);
    }
}
 
// This code is contributed by subhammahato348.

Javascript




<script>
      // JavaScript program to implement
      // the above approach
 
      // Function to find the nearest power of
      // two for every digit of a given number
      function highestPowerOfTwo(num) {
        // Converting number to string
        var s = num.toString();
 
        // Traverse the array
        for (var i = 0; i < s.length; i++) {
          if (s[i] === "0") {
            document.write("0");
            continue;
          }
 
          // Calculate log base 2
          // of the current digit s[i]
          var lg = parseInt(Math.log2(s[i].charCodeAt(0) - 48));
 
          // Highest power of 2 <= s[i]
          var p = Math.pow(2, lg);
 
          // ASCII conversion
          document.write(String.fromCharCode(p + 48));
        }
      }
 
      // Driver Code
      var num = 4317;
      highestPowerOfTwo(num);
    </script>

 
 

Output: 
4214

 

Time Complexity: O(logN)
Auxiliary Space: O(1) 

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :