Open In App

Same Number Of Set Bits As N

Given a positive integer N, find out how many positive integers strictly less than N have the same number of set bits as N.

Examples:  



Input : 8
Output :3
Explanation: Binary representation of
8 : 1000, so number of set bits in 8 is 1.
So the integers less than 8 with same number 
of set bits are : 4, 2, 1

Input :1
Output :0

Input :4
Output :2 

Approach1:  

1. Using __builtin_popcount() inbuilt function, count set bits in N and store into a 
temp variable 
2. Iterate from n-1 to 1 and also count set bits in i using __builtin_popcount() 
function
3. Now, compare temp with __builtin_popcount(i)
4. If both are equal then increment counter variable
5. Return counter

Below is the implementation of the above approach.  






// CPP program to find numbers less than N
// that have same Number Of Set Bits As N
#include <iostream>
using namespace std;
 
int smallerNumsWithSameSetBits(int n)
{       
    // __builtin_popcount function that count
    // set bits in n
    int temp = __builtin_popcount(n);
     
    // Iterate from n-1 to 1
    int count = 0;
    for (int i = n - 1; i > 0; i--) {
         
        // check if the number of set bits
        // equals to temp increment count       
        if (temp == __builtin_popcount(i))
            count++;
    }
    return count;
}
 
// Driver Code
int main()
{
    int n = 4;
    cout << smallerNumsWithSameSetBits(n);
    return 0;
}




// Java program to find numbers less than N
// that have same Number Of Set Bits As N
class GFG {
     
    // returns number of set bits in a number
    static int __builtin_popcount(int n)
    {
        int d, t = 0;
         
        while(n > 0)
        {
            d = n % 2;
            n = n / 2;
            if(d == 1)
                t++;
        }
        return t;
    }
     
    static int smallerNumsWithSameSetBits(int n)
    {    
        // __builtin_popcount function that count
        // set bits in n
        int temp = __builtin_popcount(n);
         
        // Iterate from n-1 to 1
        int count = 0;
        for (int i = n - 1; i > 0; i--) {
             
            // check if the number of set bits
            // equals to temp increment count    
            if (temp == __builtin_popcount(i))
                count++;
        }
        return count;
    }
     
    // Driver Code
    public static void main(String[] args)
    {
        int n = 4;
        System.out.println(
            smallerNumsWithSameSetBits(n));
    }
}
 
// This code is contributed by Arnab Kundu.




# Python3 program to find numbers
# less than N that have same
# Number Of Set Bits As N
def __builtin_popcount(n) :
    t = 0   
    while(n > 0) :
        d = n % 2
        n = int(n / 2)
        if(d == 1) :
            t = t + 1
    return t
 
def smallerNumsWithSameSetBits(n) :   
     
    # __builtin_popcount function
    # that count set bits in n
    temp = __builtin_popcount(n)
     
    # Iterate from n-1 to 1
    count = 0
    for i in range(n-1,0,-1) :    
         
        # check if the number of
        # set bits equals to temp
        # increment count    
        if (temp == __builtin_popcount(i)) :
            count = count + 1
    return count
 
# Driver Code
n = 4
print (smallerNumsWithSameSetBits(n))
 
# This code is contributed by
# Manish Shaw(manishshaw1)




// C# program to find numbers less than N
// that have same Number Of Set Bits As N
using System;
 
class GFG {
     
    // returns number of set bits in a number
    static int __builtin_popcount(int n)
    {
        int d, t = 0;
          
        while(n > 0)
        {
            d = n % 2;
            n = n / 2;
            if(d == 1)
                t++;
        }
        return t;
    }
     
    static int smallerNumsWithSameSetBits(int n)
    {    
        // __builtin_popcount function that count
        // set bits in n
        int temp = __builtin_popcount(n);
         
        // Iterate from n-1 to 1
        int count = 0;
        for (int i = n - 1; i > 0; i--) {
             
            // check if the number of set bits
            // equals to temp increment count    
            if (temp == __builtin_popcount(i))
                count++;
        }
        return count;
    }
     
    // Driver Code
    static public void Main(String []args)
    {
        int n = 4;
        Console.WriteLine(
            smallerNumsWithSameSetBits(n));
    }
}
 
// This code is contributed by Arnab Kundu.




<?php
// PHP program to find numbers
// less than N that have same
// Number Of Set Bits As N
function __builtin_popcount($n)
{
    $t = 0;    
    while($n > 0)
    {
        $d = $n % 2;
        $n = intval($n / 2);
        if($d == 1)
            $t++;
    }
    return $t;
}
function smallerNumsWithSameSetBits($n)
{    
    // __builtin_popcount function
    // that count set bits in n
    $temp = __builtin_popcount($n);
     
    // Iterate from n-1 to 1
    $count = 0;
    for ($i = $n - 1; $i > 0; $i--)
    {
         
        // check if the number of
        // set bits equals to temp
        // increment count    
        if ($temp == __builtin_popcount($i))
            $count++;
    }
    return $count;
}
 
// Driver Code
$n = 4;
echo (smallerNumsWithSameSetBits($n));
 
// This code is contributed by
// Manish Shaw(manishshaw1)
?>




<script>
 
// Javascript program to find numbers less than N
// that have same Number Of Set Bits As N
 
// returns number of set bits in a number
function __builtin_popcount(n)
{
    var d, t = 0;
     
    while(n > 0)
    {
        d = n % 2;
        n = parseInt(n / 2);
        if(d == 1)
            t++;
    }
    return t;
}
 
function smallerNumsWithSameSetBits(n)
{       
    // __builtin_popcount function that count
    // set bits in n
    var temp = __builtin_popcount(n);
     
    // Iterate from n-1 to 1
    var count = 0;
    for (var i = n - 1; i > 0; i--) {
         
        // check if the number of set bits
        // equals to temp increment count       
        if (temp == __builtin_popcount(i))
            count++;
    }
    return count;
}
 
// Driver Code
var n = 4;
document.write( smallerNumsWithSameSetBits(n));
 
 
</script>

Output: 
2

 

Time Complexity: O(N log N), where N is the input number

Space Complexity: O(1)

Approach 2: This problem can be solved using Bit Manipulation and Pascal Triangle.

Below is the implementation of the above approach:




#include <bits/stdc++.h>
using namespace std;
 
long long dp[41][41];
int pre = 0;
 
long long ncr(int n, int r)
{
    if (!pre) {
        // Using Pascal's triangle to precompute all
        // possible nCr
        pre = 1;
        dp[0][0] = 0;
        dp[1][0] = 1;
        dp[1][1] = 1;
 
        for (int i = 2; i <= 40; i++) {
            dp[i][0] = 1;
            for (int j = 1; j < i; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
            }
            dp[i][i] = 1;
        }
    }
    return dp[n][r];
}
 
long long count(long long x)
{
    long long ans = 0;
    long long cnt = 0;
    long long len = 0;
    while (x > 0) {
        if (x & 1) {
            cnt++;
            ans += ncr(len, cnt);
        }
        len++;
        x >>= 1;
    }
    return ans;
}
 
int main()
{
 
    int N = 4;
    cout << count(N) << endl;
    return 0;
}




public class Main {
 
  static long[][] dp = new long[41][41];
  static int pre = 0;
 
  static long ncr(long n, long r) {
    if (pre == 0)
    {
       
      // Using Pascal's triangle to precompute all
      // possible nCr
      pre = 1;
      dp[0][0] = 0;
      dp[1][0] = 1;
      dp[1][1] = 1;
 
      for (int i = 2; i <= 40; i++) {
        dp[i][0] = 1;
        for (int j = 1; j < i; j++) {
          dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
        }
        dp[i][i] = 1;
      }
    }
    return dp[(int)n][(int)r];
  }
 
  static long count(long x) {
    long ans = 0;
    long cnt = 0;
    long len = 0;
    while (x > 0) {
      if ((x & 1) == 1) {
        cnt++;
        ans += ncr(len, cnt);
      }
      len++;
      x >>= 1;
    }
    return ans;
  }
 
  public static void main(String[] args) {
    int N = 4;
    System.out.println(count(N));
  }
}
 
// This code is contributed by ishankhandelwals.




dp = [[0 for i in range(41)] for j in range(41)]
pre = 0
 
def ncr(n, r):
    global pre
    if pre == 0:
        pre = 1
        dp[0][0] = 0
        dp[1][0] = 1
        dp[1][1] = 1
 
        for i in range(2, 41):
            dp[i][0] = 1
            for j in range(1, i):
                dp[i][j] = dp[i-1][j] + dp[i-1][j-1]
            dp[i][i] = 1
    return dp[n][r]
 
def count(x):
    ans = 0
    cnt = 0
    len = 0
    while x > 0:
        if x & 1:
            cnt += 1
            ans += ncr(len, cnt)
        len += 1
        x >>= 1
    return ans
 
N = 4
print(count(N))
 
# This code is contributed by ishankhandelwals.




using System;
 
class GFG {
  static int ncr(int n, int r)
  {
    int[, ] dp = new int[41, 41];
    int pre = 0;
    if (pre == 0)
    {
 
      // Using Pascal's triangle to precompute all
      // possible nCr
      pre = 1;
      dp[0, 0] = 0;
      dp[1, 0] = 1;
      dp[1, 1] = 1;
 
      for (int i = 2; i <= 40; i++) {
        dp[i, 0] = 1;
        for (int j = 1; j < i; j++) {
          dp[i, j]
            = dp[i - 1, j] + dp[i - 1, j - 1];
        }
        dp[i, i] = 1;
      }
    }
    return dp[n, r];
  }
 
  static int count(int x)
  {
    int ans = 0;
    int cnt = 0;
    int len = 0;
    while (x > 0) {
      if ((x & 1) != 0) {
        cnt++;
        ans += ncr(len, cnt);
      }
      len++;
      x >>= 1;
    }
    return ans;
  }
  static void Main()
  {
    int N = 4;
    Console.Write(count(N));
  }
}
 
// This code is contributed by garg28harsh.




let dp= new Array(41);
let pre = 0;
 
function ncr(n, r)
{
    if (pre == 0)
    {
     
        // Using Pascal's triangle to precompute all
        // possible nCr
        pre = 1;
        dp[0][0] = 0;
        dp[1][0] = 1;
        dp[1][1] = 1;
 
        for (let i = 2; i <= 40; i++) {
            dp[i][0] = 1;
            for (let j = 1; j < i; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
            }
            dp[i][i] = 1;
        }
    }
    return dp[n][r];
}
 
function count( x)
{
    let ans = 0;
    let cnt = 0;
    let len = 0;
    for(let i=0;i<41;i++)
        dp[i] = new Array(41);
    while (x > 0) {
        if (x & 1) {
            cnt++;
            ans += ncr(len, cnt);
        }
        len++;
        x >>= 1;
    }
    return ans;
}
    
    let N = 4;
    console.log(count(N));
    
   // This code is contributed by garg28harsh.

Output
2

Time Complexity: O(log N)

Space Complexity: O(N^2).


Article Tags :