Check if a number can be represented as sum of non zero powers of 2
Given an integer N, the task is to check whether N can be represented as the sum of powers of 2 where all the powers are > 0 i.e. 20 cannot contribute to the sum.
Examples:
Input: N = 10
Output: 1
23 + 21 = 10
Input: N = 9
Output: 0
Approach: There are two cases:
- When N is even then it can always be represented as the sum of powers of 2 when power > 0.
- When N is odd then it can never be represented as the sum of powers of 2 if 20 is not included in the sum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool isSumOfPowersOfTwo( int n)
{
if (n % 2 == 1)
return false ;
else
return true ;
}
int main()
{
int n = 10;
if (isSumOfPowersOfTwo(n))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
class GFG {
static boolean isSumOfPowersOfTwo( int n)
{
if (n % 2 == 1)
return false ;
else
return true ;
}
public static void main(String args[])
{
int n = 10;
if (isSumOfPowersOfTwo(n))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def isSumOfPowersOfTwo(n):
if n % 2 = = 1 :
return False
else :
return True
n = 10
if isSumOfPowersOfTwo(n):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG {
static bool isSumOfPowersOfTwo( int n)
{
if (n % 2 == 1)
return false ;
else
return true ;
}
public static void Main()
{
int n = 10;
if (isSumOfPowersOfTwo(n))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
Javascript
<script>
function isSumOfPowersOfTwo(n)
{
if (n % 2 == 1)
return false ;
else
return true ;
}
var n = 10;
if (isSumOfPowersOfTwo(n))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
PHP
<?php
function isSumOfPowersOfTwo( $n )
{
if ( $n % 2 == 1)
return false;
else
return true;
}
$n = 10;
if (isSumOfPowersOfTwo( $n ))
echo ( "Yes" );
else
echo ( "No" );
?>
|
Time Complexity: O(1)
Auxiliary Space: O(1)
Approach 2:
Here’s another approach to solve the problem:
- Start with the given number n.
- Initialize a variable i to 1.
- While i is less than n, do the following steps:
- a. If i is a power of 2, compute n-i.
- b. If n-i is also a power of 2, return true.
- c. Increment i by 1.
- If none of the pairs (i, n-i) are both powers of 2, return false.
Here’s the code for the above approach:
C++
#include <iostream>
#include <cmath>
using namespace std;
bool isPowerOfTwo( int n) {
if (n == 0) {
return false ;
}
return ( ceil (log2(n)) == floor (log2(n)));
}
bool canSumToPowerOfTwo( int n) {
for ( int i = 1; i < n; i++) {
if (isPowerOfTwo(i) && isPowerOfTwo(n-i)) {
return true ;
}
}
return false ;
}
int main() {
int n = 10;
if (canSumToPowerOfTwo(n)) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
return 0;
}
|
Java
import java.lang.Math;
public class PowerOfTwo {
public static boolean isPowerOfTwo( int n) {
if (n == 0 ) {
return false ;
}
return (Math.ceil(Math.log(n) / Math.log( 2 )) == Math.floor(Math.log(n) / Math.log( 2 )));
}
public static boolean canSumToPowerOfTwo( int n) {
for ( int i = 1 ; i < n; i++) {
if (isPowerOfTwo(i) && isPowerOfTwo(n - i)) {
return true ;
}
}
return false ;
}
public static void main(String[] args) {
int n = 10 ;
if (canSumToPowerOfTwo(n)) {
System.out.println( "Yes" );
} else {
System.out.println( "No" );
}
}
}
|
Python3
import math
def isPowerOfTwo(n):
if n = = 0 :
return False
return math.ceil(math.log2(n)) = = math.floor(math.log2(n))
def canSumToPowerOfTwo(n):
for i in range ( 1 , n):
if isPowerOfTwo(i) and isPowerOfTwo(n - i):
return True
return False
def main():
n = 10
if canSumToPowerOfTwo(n):
print ( "Yes" )
else :
print ( "No" )
if __name__ = = "__main__" :
main()
|
C#
using System;
class Program
{
static bool IsPowerOfTwo( int n)
{
if (n == 0)
{
return false ;
}
double logValue = Math.Log(n, 2);
return logValue == ( int )logValue;
}
static bool CanSumToPowerOfTwo( int n)
{
for ( int i = 1; i < n; i++)
{
if (IsPowerOfTwo(i) && IsPowerOfTwo(n - i))
{
return true ;
}
}
return false ;
}
static void Main( string [] args)
{
int n = 10;
if (CanSumToPowerOfTwo(n))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
}
|
Javascript
function isPowerOfTwo(n) {
if (n == 0) {
return false ;
}
return (Math.ceil(Math.log2(n)) == Math.floor(Math.log2(n)));
}
function canSumToPowerOfTwo(n) {
for (let i = 1; i < n; i++) {
if (isPowerOfTwo(i) && isPowerOfTwo(n-i)) {
return true ;
}
}
return false ;
}
let n = 10;
if (canSumToPowerOfTwo(n)) {
console.log( "Yes" );
}
else {
console.log( "No" );
}
|
Output:
Yes
Time Complexity: O(1)
Auxiliary Space: O(1)
Last Updated :
19 Oct, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...