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++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function that return true if n // can be represented as the sum // of powers of 2 without using 2^0 bool isSumOfPowersOfTwo( int n) { if (n % 2 == 1) return false ; else return true ; } // Driver code int main() { int n = 10; if (isSumOfPowersOfTwo(n)) cout << "Yes" ; else cout << "No" ; return 0; } |
Java
// Java implementation of the approach class GFG { // Function that return true if n // can be represented as the sum // of powers of 2 without using 2^0 static boolean isSumOfPowersOfTwo( int n) { if (n % 2 == 1) return false ; else return true ; } // Driver code public static void main(String args[]) { int n = 10; if (isSumOfPowersOfTwo(n)) System.out.print( "Yes" ); else System.out.print( "No" ); } } |
Python3
# Python3 implementation of the approach # Function that return true if n # can be represented as the sum # of powers of 2 without using 2^0 def isSumOfPowersOfTwo(n): if n % 2 = = 1 : return False else : return True # Driver code n = 10 if isSumOfPowersOfTwo(n): print ( "Yes" ) else : print ( "No" ) # This code is contributed # by Shrikant13 |
C#
// C# implementation of the approach using System; class GFG { // Function that return true if n // can be represented as the sum // of powers of 2 without using 2^0 static bool isSumOfPowersOfTwo( int n) { if (n % 2 == 1) return false ; else return true ; } // Driver code public static void Main() { int n = 10; if (isSumOfPowersOfTwo(n)) Console.WriteLine( "Yes" ); else Console.WriteLine( "No" ); } } |
PHP
<?php // PHP implementation of the approach // Function that return true if n // can be represented as the sum // of powers of 2 without using 2^0 function isSumOfPowersOfTwo( $n ) { if ( $n % 2 == 1) return false; else return true; } // Driver code $n = 10; if (isSumOfPowersOfTwo( $n )) echo ( "Yes" ); else echo ( "No" ); // This code is contributed // by Code_Mech ?> |
Javascript
<script> // Javascript implementation of the approach // Function that return true if n // can be represented as the sum // of powers of 2 without using 2^0 function isSumOfPowersOfTwo(n) { if (n % 2 == 1) return false ; else return true ; } // Driver code var n = 10; if (isSumOfPowersOfTwo(n)) document.write( "Yes" ); else document.write( "No" ); // This code is contributed by noob2000. </script> |
Output:
Yes
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; } |
Javascript
// This function determines if a given integer n is a power of two function isPowerOfTwo(n) { if (n == 0) { return false ; } return (Math.ceil(Math.log2(n)) == Math.floor(Math.log2(n))); } // This function determines if it is possible to represent a given integer n // as the sum of two distinct powers of two function canSumToPowerOfTwo(n) { // Loop through all possible pairs of powers of two that sum to n for (let i = 1; i < n; i++) { if (isPowerOfTwo(i) && isPowerOfTwo(n-i)) { return true ; } } // If no such pair exists, return false return false ; } // Test the function with some sample input let n = 10; if (canSumToPowerOfTwo(n)) { console.log( "Yes" ); } else { console.log( "No" ); } |
Output:
Yes
Time Complexity: O(1)
Auxiliary Space: O(1)
Please Login to comment...