【C++】判断是不是2、3、4的幂数

判断一个数是不是2的幂数。若n是2的幂数的话,那么n的二进制中含有1的只有1位;可以用(n&(n-1))==0来判断是不是只有一位为1.

bool twoMi(int n){
    if((n&(n-1))==0)
        return true;
    else
        return false;
}

判断n是不是3的幂数。
方法:使用一个在整数范围内最大的3的幂数对n求余数,若余数为0那么n是3的幂数,否则不是3的幂数。
这类方法只适合判断是不是素数的幂数,因为素数只能整除自身和1。若n是由该素数和一个合数相乘而来,那么大素数取余的余数肯定不为0;
假设Big3为最大的3的幂,若n是3的幂数,那么肯定有Big3Mi%n==0;若n不是3的幂数,那么n肯定可以被写成 n=3th (其中 t>=0 ,h为除去3的其他数),那么Big3Mi%n最后肯定可以被写成 3u %h,由于素数只能被1和自身整除所以余数肯定不为0,那么这个数就肯定不是3的幂数;
而对于非素数来说在进行到最后一步 3u %h的时候,由于合数是可以被除自身和1以外的其他数整除,所以不能保证余数肯定不为0,那就无法判断n不是该数的幂数。

bool sanMi(int n){
//得到3的最大数:
int k = log(INT_MAX)/log(3);
int Big3Mi = pow(3,k);
return (Big3Mi%n)==0;
}

判断是不是4的幂数

//判断n是不是4的幂数,n&0x55555555是为了过滤掉类似2,8这种类型的数,留下4,16这种类型的数
bool siMi(int n){
    if(((n&(n-1))==0)&&(n&0x55555555))
        return true;
    else
        return false;
}

其他:在计算3的最大幂的时候先求出该最大值时所对应的3的幂数k: 3k=INT_MAX
k=log(INT_MAX)/log(3) 这个是利用 log320=ln(20)/ln(3) 的原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯拿铁go

你的打赏是我更新最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值