Count of numbers which can be made power of 2 by given operation
Given a array arr[], the task is to count the numbers which can be made power of 2 with the following operation:
1 can be added to any element atmost once if its not already a power of 2.
Examples:
Input: arr[] = {2, 3, 7, 9, 15}
Output: 4
3, 7 and 15 can be made a power of 2 by adding 1, and 2 is already a power of 2
Input: arr[] = {5, 6, 9, 3, 1}
Output: 2
Approach: Traverse the array and check if the current element is a power of 2, if it is then update count = count + 1. If its not a power of 2 then check for one element greater i.e. arr[i] + 1. To check if an element is a power of 2:
- Naive method is to repeatedly divide the element by 2 until it gives either 0 or 1 as the remainder. if the remainder is 1 then its a power of 2 else its not a power of 2.
- Efficient method: If X & (X – 1) = 0 then X is a power of two.
Say, X = 16 = 10000 and X – 1 = 15 = 01111 then X & (X – 1) = 10000 & 01111 = 0 i.e. X = 16 is a power of 2.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPowerOfTwo( int x)
{
if (x == 0)
return false ;
if (!(x & (x - 1)))
return true ;
else
return false ;
}
int countNum( int a[], int n)
{
int count = 0;
for ( int i = 0; i < n; i++) {
if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1))
count++;
}
return count;
}
int main()
{
int arr[] = { 5, 6, 9, 3, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << countNum(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static boolean isPowerOfTwo( int x)
{
if (x == 0 )
return false ;
if ((x & (x - 1 )) == 0 )
return true ;
else
return false ;
}
static int countNum( int a[], int n)
{
int count = 0 ;
for ( int i = 0 ; i < n; i++) {
if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1 ))
count++;
}
return count;
}
public static void main(String args[])
{
int arr[] = { 5 , 6 , 9 , 3 , 1 };
int n = arr.length;
System.out.println(countNum(arr, n));
}
}
|
Python3
def isPowerOfTwo(x):
if (x = = 0 ):
return False
if ((x & (x - 1 )) = = 0 ):
return True
else :
return False
def countNum(a, n):
count = 0
for i in range ( 0 , n, 1 ):
if (isPowerOfTwo(a[i]) or
isPowerOfTwo(a[i] + 1 )):
count + = 1
return count
if __name__ = = '__main__' :
arr = [ 5 , 6 , 9 , 3 , 1 ]
n = len (arr)
print (countNum(arr, n))
|
C#
using System;
class GFG
{
static bool isPowerOfTwo( int x)
{
if (x == 0)
return false ;
if ((x & (x - 1)) == 0)
return true ;
else
return false ;
}
static int countNum( int [] a, int n)
{
int count = 0;
for ( int i = 0; i < n; i++)
{
if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1))
count++;
}
return count;
}
public static void Main()
{
int [] arr = { 5, 6, 9, 3, 1 };
int n = arr.Length;
Console.WriteLine(countNum(arr, n));
}
}
|
PHP
<?php
function isPowerOfTwo( $x )
{
if ( $x == 0)
return false;
if (!( $x & ( $x - 1)))
return true;
else
return false;
}
function countNum( $a , $n )
{
$cnt = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if (isPowerOfTwo( $a [ $i ]) ||
isPowerOfTwo( $a [ $i ] + 1))
$cnt ++;
}
return $cnt ;
}
$arr = array ( 5, 6, 9, 3, 1 );
$n = count ( $arr );
echo countNum( $arr , $n );
?>
|
Javascript
<script>
function isPowerOfTwo(x)
{
if (x == 0)
return false ;
if ((x & (x - 1)) == 0)
return true ;
else
return false ;
}
function countNum(a, n)
{
let count = 0;
for (let i = 0; i < n; i++)
{
if (isPowerOfTwo(a[i]) ||
isPowerOfTwo(a[i] + 1))
count++;
}
return count;
}
let arr = [ 5, 6, 9, 3, 1 ];
let n = arr.length;
document.write(countNum(arr, n));
</script>
|
Time Complexity: O(n), where n is the size of the given array.
Auxiliary Space: O(1)
Last Updated :
11 Nov, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...