📜  二进制表示形式的置位素数套装2

📅  最后修改于: 2021-04-29 15:40:46             🧑  作者: Mango

给定两个整数“ L”“ R” ,我们需要编写一个程序,该程序查找二进制数表示为[L,R]的具有设置位素数的数目的计数。

例子:

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

对于[L,R]范围内的每个数字,我们计算设置的位数。使用Eratosthenes筛,我们生成一个素数数组,直到范围内的最后一个数字(即R)。如果设置的位数是质数,我们增加数字的数量并打印出来。

C++
// C++ code to find count of numbers 
// having prime number of set bits 
// in their binary representation in 
// the range [L, R]
#include
using namespace std;
#include 
  
// Function to create an array of prime 
// numbers upto number 'n'
vector SieveOfEratosthenes(int n)
{
    // Create a boolean array "prime[0..n]" 
    // and initialize all entries it as false. 
    // A value in prime[i] will finally be
    // true if i is Not a prime, else false.
    bool prime[n + 1];
    memset(prime, false, sizeof(prime));
    for(int p = 2; p * p <= n; p++)
    {
        // If prime[p] is not changed, 
        // then it is a prime
        if (prime[p] == false)
              
            // Update all multiples of p
            for (int i = p * 2; i < n + 1; i += p)
                prime[i] = true;
    }
    vector lis;
      
    // Append all the prime numbers to the list
    for (int p = 2; p <=n; p++)
        if (prime[p] == false)
            lis.push_back(p);
    return lis;
}
  
// Utility function to count 
// the number of set bits
int setBits(int n){
    return __builtin_popcount (n);
}
  
// Driver code
int main ()
{
    int x = 4, y = 8;
    int count = 0;
  
    // Here prime numbers are checked till the maximum 
    // number of bits possible because that the maximum 
    // bit sum possible is the number of bits itself.
    vector 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;
}
  
// This code is contributed by mits


Java
// Java code to find count of numbers having 
// prime number of set bits in their binary  
// representation in the range[L, R]
import java.util.*;
import java.lang.Math; 
  
class GFG
{
  
// function to create an array of prime 
// numbers upto number 'n'
static ArrayList SieveOfEratosthenes(int n)
{
    // Create a boolean array "prime[0..n]" and initialize
    // all entries it as false. A value in prime[i] will
    // finally be true if i is Not a prime, else false.
    boolean[] prime = new boolean[n + 1];
    for(int p = 2; p * p <= n;p++)
    {
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == false)
              
            // Update all multiples of p
            for (int i = p * 2; i < n + 1; i += p)
                prime[i] = true;
    }
    ArrayList lis = new ArrayList();
      
    // append all the prime numbers to the list
    for (int p = 2; p <=n; p++)
        if (prime[p] == false)
            lis.add(p);
    return lis;
}
  
// utility function to count the number of set bits
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);
}
  
// Driver code
public static void main (String[] args)
{
    int x = 4, y = 8;
    int count = 0;
    ArrayList primeArr = new ArrayList();
  
    // Here prime numbers are checked till the maximum 
    // number of bits possible because that the maximum 
    // bit sum possible is the number of bits itself.
    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);
}
}
  
// This code is contributed by mits.


Python
# Python code to find  count of numbers having prime number 
# of set bits in their binary representation in the range 
# [L, R]
  
# Function to create an array of prime 
# numbers upto number 'n'
import math as m
  
def SieveOfEratosthenes(n):
  
    # Create a boolean array "prime[0..n]" and initialize
    # all entries it as true. A value in prime[i] will
    # finally be false if i is Not a prime, else true.
    prime = [True for i in range(n+1)]
    p = 2
    while(p * p <= n):
  
        # If prime[p] is not changed, then it is a prime
        if (prime[p] == True):
              
            # Update all multiples of p
            for i in range(p * 2, n+1, p):
                prime[i] = False
        p += 1
    lis = []
      
    # Append all the prime numbers to the list
    for p in range(2, n+1):
        if prime[p]:
            lis.append(p)
    return lis
  
# Utility function to count the number of set bits
def setBits(n):
    return bin(n)[2:].count('1')
  
# Driver program
if __name__ == "__main__":
    x, y = [4, 8]
    count = 0
  
    # Here prime numbers are checked till the maximum
    # number of bits possible because that the maximum 
    # bit sum possible is the number of bits itself.
    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#
// C# code to find count of numbers having prime number 
// of set bits in their binary representation in the range 
// [L, R]
using System;
using System.Linq;
using System.Collections;
class GFG{
  
// Function to create an array of prime 
// numbers upto number 'n'
static     ArrayList SieveOfEratosthenes(int n)
{
    // Create a boolean array "prime[0..n]" and initialize
    // all entries it as false. A value in prime[i] will
    // finally be true if i is Not a prime, else false.
    bool[] prime = new bool[n+1];
    for(int p=2;p * p <= n;p++)
    {
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == false)
              
            // Update all multiples of p
            for (int i=p * 2;i c == '1');
}
  
// Driver program
public static void Main () {
  
    int x=4, y=8;
    int count = 0;
    ArrayList primeArr=new ArrayList();
  
    // Here prime numbers are checked till the maximum 
    // number of bits possible because that the maximum 
    // bit sum possible is the number of bits itself.
    primeArr = SieveOfEratosthenes(Convert.ToInt32(Math.Ceiling(Math.Log(y,2.0))));
    for(int i=x;i


PHP
>=1;};
    return $cnt; 
}
  
    // Driver program 
    $x = 4;
    $y = 8; 
    $count = 0;
  
    // Here prime numbers are checked till the maximum 
    // number of bits possible because that the maximum
    // bit sum possible is the number of bits itself.
    $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); 
  
// This code is contributed by mits
?>


输出:

3