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

📅  最后修改于: 2021-04-26 06:22:35             🧑  作者: Mango

给定两个整数“ L”和“ R”,编写一个程序以查找二进制数在[L,R]范围内具有设置位素数的总数。

例子:

Input  : l = 6, r = 10
Output : 4
Explanation  :
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)
Hence count is 4

Input  : l = 10, r = 15
Output : 5
10 -> 1010 (2 set bits, 2 is prime)
11 -> 1011 (3 set bits, 3 is prime)
12 -> 1100 (2 set bits, 2 is prime)
13 -> 1101 (3 set bits, 3 is prime)
14 -> 1110 (3 set bits, 3 is prime)
Hence count is 5

说明:在此程序中,我们找到一个总数,该总数具有设置位的质数。因此,我们使用CPP预定义函数__builtin_popcount(),这些函数提供了总数上的已设置位。并检查总位是否为素数,如果素数我们增加计数器,这些过程将重复进行直到给定范围。

C++
// C++ program to count total prime
// number of set bits in given range
#include 
using namespace std;
 
bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)  return false;
    if (n <= 3)  return true;
  
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n%2 == 0 || n%3 == 0) return false;
  
    for (int i=5; i*i<=n; i=i+6)
        if (n%i == 0 || n%(i+2) == 0)
           return false;
  
    return true;
}
 
// count number, that contains prime number of set bit
int primeBitsInRange(int l, int r)
{
    // tot_bit store number of bit in number
    int tot_bit, count = 0;
 
    // iterate loop from l to r
    for (int i = l; i <= r; i++) {
 
        // use predefined function for finding
        // set bit it is return number of set bit
        tot_bit = __builtin_popcount(i);
 
        // check tot_bit prime or, not
        if (isPrime(tot_bit))
            count++;
    }
    return count;
}
 
// Driven Program
int main()
{
    int l = 6, r = 10;   
    cout << primeBitsInRange(l, r);
    return 0;
}


Java
// Java program to count total prime
// number of set bits in given range
import java.lang.*;
 
class GFG{
static boolean isPrime(int n)
{
    // Corner cases
    if (n <= 1) return false;
    if (n <= 3) return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n%2 == 0 || n%3 == 0) return false;
 
    for (int i=5; i*i<=n; i=i+6)
        if (n%i == 0 || n%(i+2) == 0)
        return false;
 
    return true;
}
 
// count number, that contains prime number of set bit
static int primeBitsInRange(int l, int r)
{
    // tot_bit store number of bit in number
    int tot_bit, count = 0;
 
    // iterate loop from l to r
    for (int i = l; i <= r; i++) {
 
        // use predefined function for finding
        // set bit it is return number of set bit
        tot_bit = Integer.bitCount(i);
 
        // check tot_bit prime or, not
        if (isPrime(tot_bit))
            count++;
    }
    return count;
}
 
// Driven Program
public static void main(String[] args)
{
    int l = 6, r = 10;
    System.out.println(primeBitsInRange(l, r));
     
}
}
// This code is Contributed by mits


Python3
# Python3 program to count total prime
# number of set bits in given range
def isPrime(n):
 
    # Corner cases
    if (n <= 1): return False;
    if (n <= 3): return True;
 
    # This is checked so that we can skip
    # middle five numbers in below loop
    if (n % 2 == 0 or n % 3 == 0):
        return False;
         
    i = 5;
    while (i * i <= n):
        if(n % i == 0 or n % (i + 2) == 0):
            return False;
        i = i + 6;
 
    return True;
 
# count number, that contains
# prime number of set bit
def primeBitsInRange(l, r):
 
    # tot_bit store number of
    # bit in number
    count = 0;
 
    # iterate loop from l to r
    for i in range(l, r + 1):
 
        # use predefined function for finding
        # set bit it is return number of set bit
        tot_bit = bin(i).count('1');
 
        # check tot_bit prime or, not
        if (isPrime(tot_bit)):
            count += 1;
 
    return count;
 
# Driver Code
l = 6;
r = 10;
print(primeBitsInRange(l, r));
 
# This code is contributed by mits


C#
// C# program to count total prime
// number of set bits in given range
 
class GFG{
     
    // To count the bits
static int BitCount(int n)
{
    int count = 0;
    while (n != 0)
    {
        count++;
        n &= (n - 1);
    }
     
    return count;
}
         
static bool isPrime(int n)
{
    // Corner cases
    if (n <= 1) return false;
    if (n <= 3) return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n%2 == 0 || n%3 == 0) return false;
 
    for (int i=5; i*i<=n; i=i+6)
        if (n%i == 0 || n%(i+2) == 0)
        return false;
 
    return true;
}
 
// count number, that contains prime number of set bit
static int primeBitsInRange(int l, int r)
{
    // tot_bit store number of bit in number
    int tot_bit, count = 0;
 
    // iterate loop from l to r
    for (int i = l; i <= r; i++) {
 
        // use predefined function for finding
        // set bit it is return number of set bit
        tot_bit = BitCount(i);
 
        // check tot_bit prime or, not
        if (isPrime(tot_bit))
            count++;
    }
    return count;
}
 
// Driven Program
public static void Main()
{
    int l = 6, r = 10;
    System.Console.WriteLine(primeBitsInRange(l, r));
     
}
}
// This code is Contributed by mits


PHP


Javascript


输出:
4

时间复杂度:令n =(rl)
因此整体时间复杂度为N * sqrt(N)
我们可以使用Eratosthenes筛网优化上述解决方案。
二进制表示形式的置位素数套装2