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

来源:互联网 发布:apt-get insall yum 编辑:程序博客网 时间:2024/06/13 23:11

判断一个数是不是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)的原理。

原创粉丝点击