在线编译器 C

#include <stdio.h> int is2pow(int n){ while(n>1){ while(n%2==0){ n=n/2; } if(n==1){ return 0; } }return 1; } int main(){ int x,num=0; scanf("%d",&x); num=is2pow(x); printf("%d",num); return 0; }
这段代码的目的是判断一个整数是否是2的幂次方。函数 `is2pow` 的返回值设计有些混乱:当输入是2的幂时返回0,否则返回1,这与通常的直觉相反。

代码逻辑上的主要问题在于循环结构。外层 `while(n>1)` 会一直执行,但内层循环把 `n` 不断除以2,直到 `n` 变成奇数。如果 `n` 最终等于1,函数返回0;否则继续外层循环。但这里有一个关键错误:当 `n` 变成奇数且不等于1时(比如3),外层循环会再次进入,但内层循环条件 `n%2==0` 不成立,所以内层循环不执行,然后 `if(n==1)` 也不成立,于是外层循环继续,陷入无限循环。

- 提示1:检查当 `n` 是奇数且不等于1时,程序会发生什么?外层循环是否会无限运行?
- 提示2:判断一个数是否是2的幂,通常只需要不断除以2直到变成1,或者用位运算。想一想如何简化循环结构,避免无限循环。