[思路]:尋找給定兩個(gè)整數(shù)區(qū)間內(nèi)的整數(shù)的二進(jìn)制表示擁有素?cái)?shù)個(gè)數(shù)的1左电;
例如:
21的二進(jìn)制:10101 ,三位1,為素?cái)?shù)权薯;
1 不是素?cái)?shù)讼呢;
一種方法是:計(jì)算整數(shù)的二進(jìn)制表示撩鹿;然后統(tǒng)計(jì)1的個(gè)數(shù);
另一種方法: 使用位運(yùn)算悦屏,通過移位和1相與节沦,來統(tǒng)計(jì)1的個(gè)數(shù);
本次題限制【1,100000】之間础爬,最大位數(shù)20位甫贯,所有位數(shù)的素?cái)?shù)有:
{2, 3, 5, 7, 11, 13, 17, 19}
int countPrimeSetBits(int L, int R) {
set<int> primes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
int cnt = 0;
for (int i = L; i <= R; i++) {
int bits = 0;
for (int n = i; n>0; n >>= 1)
bits += n & 1;
cnt += primes.count(bits);
}
return cnt;
}