给定两个整数“ 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