【LeetCode】 762. 二进制表示中质数个计算置位

版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83549368

1.题目

给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。
(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)

2.思路

step1:把L到R的数字依次换算成二进制
step2:把二进制数中的1统计出来,c
step3:判断c是不是素数

3.代码

class Solution {
public:
   bool isprime(int n){
	if(n==1||n==0)
		return false;
	else{
		for(int i=2;i<=n/2;i++){
			if(n%i==0)
				return false;
		}
		return true;
	}
}
int countPrimeSetBits(int L, int R){
	int res=0;
	for(int i=L;i<=R;i++){
		int div=i;
		int c=0;
		while(div){
			int j=div%2;
			if(j==1)
				c++;
			div/=2;
		}
		if(isprime(c))
			res++;
	}
	return res;
}
};

4.优秀案例

class Solution 
{
public:
    int countPrimeSetBits(int L, int R) 
    {
        int count = 0;                  //质数的个数
        int data;                       //计算置位的一个中间值
        int n;                          //计算置位
        bool isRight;
       //int prime[] = {2, 3, 5, 7, 11, 13, 17, 19};
        for(int i = L; i <= R; i++)
        {
            data = i;
            n = 0;
            isRight = true;
            while(data != 0)
            {
                n++;
                data = (data & (data - 1));
            }
            
            if(n == 1 || n == 0)
            {
                isRight = false;
            }
            for(int j = 2; j < n; j++)
            {
                if(n % j == 0)
                {
                    isRight = false;
                    break;
                }
            }
            if(isRight)
            {
                count++;
            }
        }
        return count;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_37621506/article/details/83549368