二进制表示中质数个计算置位

题目

给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。

计算置位位数 就是二进制表示中 1 的个数。

例如, 21 的二进制表示 10101 有 3 个计算置位

原题链接

题目分析

这道题本身就不难,不过还是能学到不少东西的

统计二进制中 1的个数

直接将十进制转为二进制

这里直接统计就行

int count(int num){
        int n =0;
        while(num){
            n += (num%2);
            num /= 2;
        }
        //cout<<"n: "<<n<<endl;
        return n;
    }

使用内置函数

__builtin_popcount()函数是c++自带的统计1的函数,直接调用就行

判断是否是质数

六素数法

我个人还是强烈推荐这种方法的,既省时间又省空间,通过质数(除了2,3)只会出现在6倍数的两侧的特性来进行判断

 bool isPrime(int n){
        if(n == 1) return false;
        if(n == 2 || n == 3 ) return true;
        if(n%2 == 0 || n%3 == 0) return false;
        int k = sqrt(n) + 1;
        for(int i = 5;i<k;i+=6){
            if( n % i == 0 || n % (i+2) == 0 ){
                return false;
            }
        }
        return true;
    }

直接打表

因为题目的限制,这里最多也就只能到31位,所以统计一下31位以内的质数就行,

unordered_set<int> prime = {2,3,5,7,11,13,17,19,23,29,31};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值