Number of integers with odd number of set bits
Given a number n, count number of integers smaller than or equal to n that have odd number of set bits.
Examples:
Input : 5
Output : 3
Explanation :
Integers with odd number of
set bits in range 1 to 5 :
0 contains 0 set bits
1 contains 1 set bits
2 contains 1 set bits
3 contains 2 set bits
4 contains 1 set bits
5 contains 2 set bits
Input : 10
Output : 5
Explanation :
Integers with odd set bits are 1, 2,
4, 7 and 8.
Prerequisites: Count number of set bits
The idea is based on below fact.
If n is odd then there are total n+1 integers smaller than or equal to n (0, 1, 2 … n) and half of these integers contain odd number of set bits.
How to handle case when n is even? We know result for n-1. We count set bits in n and add 1 to n/2 if the count is odd. Else we return n/2.
C++
#include <bits/stdc++.h>
using namespace std;
int countWithOddSetBits( int n)
{
if (n % 2 != 0)
return (n + 1) / 2;
int count = __builtin_popcount(n);
int ans = n / 2;
if (count % 2 != 0)
ans++;
return ans;
}
int main()
{
int n = 10;
cout << countWithOddSetBits(n);
return 0;
}
|
C
#include <stdio.h>
int countWithOddSetBits( int n)
{
if (n % 2 != 0)
return (n + 1) / 2;
int count = __builtin_popcount(n);
int ans = n / 2;
if (count % 2 != 0)
ans++;
return ans;
}
int main()
{
int n = 10;
printf ( "%d" ,countWithOddSetBits(n));
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int countWithOddSetBits( int n)
{
if (n % 2 != 0 )
return (n + 1 ) / 2 ;
int count = (n);
int ans = n / 2 ;
if (count % 2 != 0 )
ans++;
return ans;
}
public static void main (String[] args)
{
int n = 10 ;
System.out.println( countWithOddSetBits(n));
}
}
|
Python3
def countWithOddSetBits(n):
if (n % 2 ! = 0 ):
return (n + 1 ) / 2
count = bin (n).count( '1' )
ans = n / 2
if (count % 2 ! = 0 ):
ans + = 1
return ans
if __name__ = = '__main__' :
n = 10
print ( int (countWithOddSetBits(n)))
|
C#
using System;
class GFG
{
static int countWithOddSetBits( int n)
{
if (n % 2 != 0)
return (n + 1) / 2;
int count = (n);
int ans = n / 2;
if (count % 2 != 0)
ans++;
return ans;
}
static public void Main ()
{
int n = 10;
Console.WriteLine(countWithOddSetBits(n));
}
}
|
PHP
<?php
function countWithOddSetBits( $n )
{
if ( $n % 2 != 0)
return ( $n + 1) / 2;
$count = ( $n );
$ans = $n / 2;
if ( $count % 2 != 0)
$ans ++;
return $ans ;
}
$n = 10;
echo countWithOddSetBits( $n );
?>
|
Javascript
<script>
function countWithOddSetBits(n)
{
if (n % 2 != 0)
return parseInt((n + 1) / 2, 10);
let count = (n);
let ans = parseInt(n / 2, 10);
if (count % 2 != 0)
ans++;
return ans;
}
let n = 10;
document.write(countWithOddSetBits(n));
</script>
|
Time complexity: O(k), where k is the max number of bits in a number.
Auxiliary space: O(1)
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...