当然这个题我们可以用最笨的遍历去做,这样的话,当数字较大的时候,效率会很低
所以这里我们考虑利用按位与(&)
首先我们考虑所有2的k次方数的特点,
比如
0001 1
0010 2
0100 4
1000 8
…
其实每一个2的k次方数转化为2进制之后,只会有一位上为1,
这就为我们打开了思路,我们只需要判断二进制位上是不是只有一个1
n = m & (m - 1);
每次我们用m&(m - 1)其实就是在消除二进制位上的1,由于二进制位只有一个1.
所以 m = 0.
完整代码如下
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int JudgePow(int n){
if (n < 1){
return 0;
}
int m = n & (n - 1);
return m == 0;
}
int main(){
int n, k;
printf("请输入一个整数n: \n");
scanf("%d", &n);
if (JudgePow(n)){
printf("%d是2的k次方\n", n);
}
else {
printf("%d不是是2的k次方\n", n);
}
system("pause");
return 0;
}