1. 程式人生 > >762. 二進位制表示中質數個計算置位 二進位制1的個數

762. 二進位制表示中質數個計算置位 二進位制1的個數

給定兩個整數 L 和 R ,找到閉區間 [L, R] 範圍內,計算置位位數為質數的整數個數。

(注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算置位。還有,1 不是質數。)

示例 1:

輸入: L = 6, R = 10
輸出: 4
解釋:
6 -> 110 (2 個計算置位,2 是質數)
7 -> 111 (3 個計算置位,3 是質數)
9 -> 1001 (2 個計算置位,2 是質數)
10-> 1010 (2 個計算置位,2 是質數)

示例 2:

輸入: L = 10, R = 15
輸出: 5
解釋:
10 -> 1010 (2 個計算置位, 2 是質數)
11 -> 1011 (3 個計算置位, 3 是質數)
12 -> 1100 (2 個計算置位, 2 是質數)
13 -> 1101 (3 個計算置位, 3 是質數)
14 -> 1110 (3 個計算置位, 3 是質數)
15 -> 1111 (4 個計算置位, 4 不是質數)

注意:

  1. L, R 是 L <= R 且在 [1, 10^6] 中的整數。
  2. R - L 的最大值為 10000。

class Solution {
public:
    int countPrimeSetBits(int L, int R) {
        bool flag[33];
        for(int i=0;i<=32;i++)
            flag[i]=true;
        for(int i=2;i<=32;i++)
        {
            if(flag[i])
            {
                for(int j=i+i;j<=32;j+=i)
                    flag[j]=false;
            }
        }
        int res=0;
        for(int i=L;i<=R;i++)
        {
            int bitnum=0;
            for(int j=0;j<32;j++)
            {
                if((i>>j)&1)
                    bitnum++;
            }
            if(flag[bitnum]&&bitnum!=1)res++;
        }
        return res;
    }
};