Powers of 2 to required sum
Last Updated :
24 Mar, 2023
Given an integer N, task is to find the numbers which when raised to the power of 2 and added finally, gives the integer N.
Example :
Input : 71307
Output : 0, 1, 3, 7, 9, 10, 12, 16
Explanation :
71307 = 2^0 + 2^1 + 2^3 + 2^7 +
2^9 + 2^10 + 2^12 + 2^16
Input : 1213
Output : 0, 2, 3, 4, 5, 7, 10
Explanation :
1213 = 2^0 + 2^2 + 2^3 + 2^4 +
2^5 + 2^7 + 2^10
Approach :
Every number can be described in powers of 2.
Example : 29 = 2^0 + 2^2 + 2^3 + 2^4.
2^0 ( exponent of 2 is ‘0’) 0
2^2 ( exponent of 2 is ‘2’) 1
2^3 ( exponent of 2 is ‘3’) 3
2^4 ( exponent of 2 is ‘4’) 4
Convert each number into its binary equivalent by pushing remainder of given number, when divided by 2 till it is greater than 0, to vector. Now, Iterate through its binary equivalent and whenever there is set bit, just print the i-th value(iteration number).
Application :
Hamming Code : Hamming Code is an error correcting code which can detect and correct one bit error. This pattern is also used in Hamming code error detection where parity bits store the XOR of numbers on the basis of LSB(Least Significant bit), where numbers are assigned in blocks and you need to find the blocks where the sum of power of 2 resulting to given number exists.
Below is the image to show the blocks with given numbers.
Below is the implementation of above approach :
C++
#include <bits/stdc++.h>
using namespace std;
void block( long int x)
{
vector< long int > v;
cout << "Blocks for " << x << " : " ;
while (x > 0)
{
v.push_back(x % 2);
x = x / 2;
}
for ( int i = 0; i < v.size(); i++)
{
if (v[i] == 1)
{
cout << i;
if (i != v.size() - 1)
cout << ", " ;
}
}
cout << endl;
}
int main()
{
block(71307);
block(1213);
block(29);
block(100);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void block( long x)
{
ArrayList<Integer> v = new ArrayList<Integer>();
System.out.print( "Blocks for " +x+ " : " );
while (x > 0 )
{
v.add(( int )x % 2 );
x = x / 2 ;
}
for ( int i = 0 ; i < v.size(); i++)
{
if (v.get(i) == 1 )
{
System.out.print(i);
if (i != v.size() - 1 )
System.out.print( ", " );
}
}
System.out.println();
}
public static void main(String args[])
{
block( 71307 );
block( 1213 );
block( 29 );
block( 100 );
}
}
|
Python3
def block(x):
v = []
print ( "Blocks for %d : " % x, end = "")
while (x > 0 ):
v.append( int (x % 2 ))
x = int (x / 2 )
for i in range ( 0 , len (v)):
if (v[i] = = 1 ):
print (i, end = "")
if (i ! = len (v) - 1 ):
print ( ", " , end = "")
print ( "\n" )
block( 71307 )
block( 1213 )
block( 29 )
block( 100 )
|
C#
using System;
using System.Collections.Generic;
class GFG {
static void block( long x)
{
List< int > v = new List< int >();
Console.Write( "Blocks for " + x + " : " );
while (x > 0)
{
v.Add(( int )x % 2);
x = x / 2;
}
for ( int i = 0; i < v.Count; i++)
{
if (v[i] == 1)
{
Console.Write(i);
if (i != v.Count - 1)
Console.Write( ", " );
}
}
Console.WriteLine();
}
public static void Main()
{
block(71307);
block(1213);
block(29);
block(100);
}
}
|
PHP
<?php
function block( $x )
{
$v = array ();
echo 'Blocks for ' . $x . ' : ' ;
while ( $x > 0)
{
array_push ( $v , intval ( $x % 2));
$x = intval ( $x / 2);
}
for ( $i = 0; $i < sizeof( $v ); $i ++)
{
if ( $v [ $i ] == 1)
{
print $i ;
if ( $i != sizeof( $v ) - 1)
echo ', ' ;
}
}
echo "\n" ;
}
block(71307);
block(1213);
block(29);
block(100);
?>
|
Javascript
<script>
function block(x)
{
let v = [];
document.write( "Blocks for " + x + " : " );
while (x > 0)
{
v.push(x % 2);
x = parseInt(x / 2, 10);
}
for (let i = 0; i < v.length; i++)
{
if (v[i] == 1)
{
document.write(i);
if (i != v.length - 1)
document.write( ", " );
}
}
document.write( "</br>" );
}
block(71307);
block(1213);
block(29);
block(100);
</script>
|
Output:
Blocks for 71307 : 0, 1, 3, 7, 9, 10, 12, 16
Blocks for 1213 : 0, 2, 3, 4, 5, 7, 10
Blocks for 29 : 0, 2, 3, 4
Blocks for 100 : 2, 5, 6
Time Complexity: O(log2n)
Auxiliary Space: O(log2n)
Another Approach( Using Binary search ) :
1. We will generate array a[] of all value from pow(2,0) to pow(2,k) , where k is the largest power of 2 such that pow(2,k) <= num . 2. Then use binary search upper_bound function to find largest value in array a[] such that value <= num .
3. Then reduce num to num-val
4. We will do this operation till num become 0.
5. Finally , print all power of 2 required to make num
Below is the implementation of the above approach :
C++
#include <bits/stdc++.h>
using namespace std;
void block( long int x)
{
int k; int i=0; long int val= pow (2,i);
vector< long int > v;
while (val<=x)
{
v.push_back(val);
k=i; i++;
val= pow (2,i);
}
set< int > ans;
while (x!=0)
{
int index = upper_bound(v.begin(),v.end(),x)-v.begin();
index--;
ans.insert(index);
x = x - v[index];
}
for ( auto val:ans)
{
cout<<val<< ", " ;}
cout<<endl;
}
int main()
{
cout<< "Blocks for 71307: " ;block(71307);
cout<< "Blocks for 1213: " ;block(1213);
cout<< "Blocks for 29: " ;block(29);
cout<< "Blocks for 100: " ;block(100);
return 0;
}
|
Java
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG
{
static void block( long x)
{
int k; int i= 0 ; long val=( long ) Math.pow( 2 ,i);
Vector<Long> v = new Vector<Long>();
while (val<=x)
{
v.add(val);
k=i; i++;
val=( long ) Math.pow( 2 ,i);
}
Set<Integer> ans = new HashSet<Integer>();
while (x!= 0 )
{
int index = Collections.binarySearch(v,x);
if (index< 0 )
{
index = -index - 1 ;
index--;
}
ans.add(index);
x = x - v.get(index);
}
for ( int va:ans)
{
System.out.print(va+ ", " );
}
System.out.println();
}
public static void main (String[] args)
{
System.out.print( "Blocks for 71307: " ); block( 71307 );
System.out.print( "Blocks for 1213: " ); block( 1213 );
System.out.print( "Blocks for 29: " ); block( 29 );
System.out.print( "Blocks for 100: " ); block( 100 );
}
}
|
Python3
import math
import bisect
def block(x):
i = 0
val = math. pow ( 2 , i)
v = []
while val < = x:
v.append(val)
i + = 1
val = math. pow ( 2 , i)
ans = set ()
while x ! = 0 :
index = bisect.bisect_right(v, x) - 1
ans.add(index)
x = x - v[index]
print ( "Blocks for {}: " . format (x), end = "")
for val in ans:
print (val, end = ", " )
print ()
if __name__ = = "__main__" :
block( 71307 )
block( 1213 )
block( 29 )
block( 100 )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void Block( long x)
{
int k; int i = 0; long val = ( long ) Math.Pow(2, i);
List< long > v = new List< long >();
while (val <= x)
{
v.Add(val);
k = i; i++;
val = ( long ) Math.Pow(2, i);
}
HashSet< int > ans = new HashSet< int >();
while (x != 0)
{
int index = v.BinarySearch(x);
if (index < 0)
{
index = ~index - 1;
}
ans.Add(index);
x = x - v[index];
}
Console.Write( "Blocks for {0}: " , x);
foreach ( int va in ans)
{
Console.Write( "{0}, " , va);
}
Console.WriteLine();
}
static void Main( string [] args)
{
Console.Write( "Blocks for 71307: " ); Block(71307);
Console.Write( "Blocks for 1213: " ); Block(1213);
Console.Write( "Blocks for 29: " ); Block(29);
Console.Write( "Blocks for 100: " ); Block(100);
}
}
|
Javascript
function block(x) {
let i = 0;
let val = Math.pow(2, i);
let v = [];
while (val <= x) {
v.push(val);
i++;
val = Math.pow(2, i);
}
let ans = new Set();
while (x != 0) {
let index = v.findIndex((element) => element > x);
if (index === -1) {
index = v.length - 1;
} else {
index--;
}
ans.add(index);
x = x - v[index];
}
console.log( 'Blocks for ' + x + ': ' + [...ans].join( ', ' ));
}
block(71307);
block(1213);
block(29);
block(100);
|
Output
Blocks for 71307: 0, 1, 3, 7, 9, 10, 12, 16,
Blocks for 1213: 0, 2, 3, 4, 5, 7, 10,
Blocks for 29: 0, 2, 3, 4,
Blocks for 100: 2, 5, 6,
Time Complexity: O(logn)
Auxiliary Space: O(logn)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...