Prime Number of Set Bits in Binary Representation | Set 2
Last Updated :
24 May, 2021
Given two integers ‘L’ and ‘R’, we need to write a program that finds the count of numbers having the prime number of set bits in their binary representation in the range [L, R].
Examples:
Input : 6 10
Output : 4
6 -> 110 (2 set bits, 2 is prime)
7 -> 111 (3 set bits, 3 is prime)
9 -> 1001 (2 set bits , 2 is prime)
10->1010 (2 set bits , 2 is prime)
Input : 10 15
Output : 5
10 -> 1010(2 number of set bits)
11 -> 1011(3 number of set bits)
12 -> 1100(2 number of set bits)
13 -> 1101(3 number of set bits)
14 -> 1110(3 number of set bits)
15 -> 1111(4 number of set bits)
Hence total count is 5
For each number in the range [L, R], we calculate the number of set bits. Using Sieve of Eratosthenes we generate a prime array up to the last number in the range (i.e. R). If the number of set bits is prime, we increase the count of the numbers and print it.
C++
#include<bits/stdc++.h>
using namespace std;
#include <cmath>
vector< int > SieveOfEratosthenes( int n)
{
bool prime[n + 1];
memset (prime, false , sizeof (prime));
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == false )
for ( int i = p * 2; i < n + 1; i += p)
prime[i] = true ;
}
vector< int > lis;
for ( int p = 2; p <=n; p++)
if (prime[p] == false )
lis.push_back(p);
return lis;
}
int setBits( int n){
return __builtin_popcount (n);
}
int main ()
{
int x = 4, y = 8;
int count = 0;
vector< int > primeArr = SieveOfEratosthenes( ceil (log2(y)));
for ( int i = x; i < y + 1; i++)
{
int temp = setBits(i);
for ( int j=0;j< primeArr.size();j++)
{ if (temp == primeArr[j])
{count += 1;
break ;
}
}
}
cout << count << endl;
return 0;
}
|
Java
import java.util.*;
import java.lang.Math;
class GFG
{
static ArrayList<Integer> SieveOfEratosthenes( int n)
{
boolean [] prime = new boolean [n + 1 ];
for ( int p = 2 ; p * p <= n;p++)
{
if (prime[p] == false )
for ( int i = p * 2 ; i < n + 1 ; i += p)
prime[i] = true ;
}
ArrayList<Integer> lis = new ArrayList<Integer>();
for ( int p = 2 ; p <=n; p++)
if (prime[p] == false )
lis.add(p);
return lis;
}
static int setBits( int n)
{
return Integer.bitCount(n);
}
public static int log2( int x)
{
return ( int ) (Math.log(x) / Math.log( 2 ) + 1e- 10 );
}
public static void main (String[] args)
{
int x = 4 , y = 8 ;
int count = 0 ;
ArrayList<Integer> primeArr = new ArrayList<Integer>();
primeArr = SieveOfEratosthenes(( int )Math.ceil(log2(y)));
for ( int i = x; i < y + 1 ; i++)
{
int temp = setBits(i);
if (primeArr.contains(temp))
count += 1 ;
}
System.out.println(count);
}
}
|
Python
import math as m
def SieveOfEratosthenes(n):
prime = [ True for i in range (n + 1 )]
p = 2
while (p * p < = n):
if (prime[p] = = True ):
for i in range (p * 2 , n + 1 , p):
prime[i] = False
p + = 1
lis = []
for p in range ( 2 , n + 1 ):
if prime[p]:
lis.append(p)
return lis
def setBits(n):
return bin (n)[ 2 :].count( '1' )
if __name__ = = "__main__" :
x, y = [ 4 , 8 ]
count = 0
primeArr = SieveOfEratosthenes( int (m.ceil(m.log(y, 2 ))))
for i in range (x, y + 1 ):
temp = setBits(i)
if temp in primeArr:
count + = 1
print (count)
|
C#
using System;
using System.Linq;
using System.Collections;
class GFG{
static ArrayList SieveOfEratosthenes( int n)
{
bool [] prime = new bool [n+1];
for ( int p=2;p * p <= n;p++)
{
if (prime[p] == false )
for ( int i=p * 2;i<n+1;i+=p)
prime[i] = true ;
}
ArrayList lis = new ArrayList();
for ( int p=2;p<=n;p++)
if (prime[p]== false )
lis.Add(p);
return lis;
}
static int setBits( int n){
return ( int )Convert.ToString(n, 2).Count(c => c == '1' );
}
public static void Main () {
int x=4, y=8;
int count = 0;
ArrayList primeArr= new ArrayList();
primeArr = SieveOfEratosthenes(Convert.ToInt32(Math.Ceiling(Math.Log(y,2.0))));
for ( int i=x;i<y+1;i++){
int temp = setBits(i);
if (primeArr.Contains(temp))
count += 1;
}
Console.WriteLine(count);
}
}
|
PHP
<?php
function SieveOfEratosthenes( $n )
{
$prime = array_fill (0, $n +1,true);
for ( $p = 2; $p * $p <= $n ; $p ++)
{
if ( $prime [ $p ] == true)
for ( $i = $p * 2; $i < $n +1; $i += $p )
$prime [ $i ] = false;
}
$lis = array ();
for ( $p =2; $p <= $n ; $p ++)
if ( $prime [ $p ])
array_push ( $lis , $p );
return $lis ;
}
function setBits( $n )
{
$cnt =0;
while ( $n ){ if ( $n &1) $cnt ++; $n >>=1;};
return $cnt ;
}
$x = 4;
$y = 8;
$count = 0;
$primeArr = SieveOfEratosthenes( ceil (log( $y ,2)));
for ( $i = $x ; $i < $y +1; $i ++)
{
$temp = setBits( $i );
if (in_array( $temp , $primeArr ))
$count += 1;
}
print ( $count );
?>
|
Javascript
<script>
function SieveOfEratosthenes(n)
{
let prime = new Array(n+1).fill( true );
for (let p = 2;p * p <= n;p++)
{
if (prime[p] == true )
for (let i=p * 2;i<n+1;i+=p)
prime[i] = false ;
}
let lis = new Array();
for (let p=2;p<=n;p++)
if (prime[p])
lis.push(p);
return lis;
}
function setBits(n)
{
let cnt=0;
while (n){ if (n&1)cnt++;n>>=1;};
return cnt;
}
let x = 4;
let y = 8;
let count = 0;
let primeArr = SieveOfEratosthenes(Math.ceil(Math.log(y,2)));
for (let i=x;i<y+1;i++)
{
let temp = setBits(i);
if (primeArr.includes(temp))
count += 1;
}
document.write(count);
</script>
|
Output:
3
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...