Online Compiler C

#include <stdio.h> int is2pow(int n) { if (n / 2 == 1 && n % 2 == 0) { return 1; } if (n == 1) { return 1; } else if (n % 2 != 0) { return 0; } else if (n % 2 == 0) { return is2pow(n / 2); } } int main() { int x; scanf("%d", &x); printf("%d", is2pow(x)); return 0; }
这段代码的目的是判断一个整数是否为2的幂次方。函数 `is2pow` 通过递归检查数字是否能被2整除,并最终判断是否等于1。但代码中存在一些逻辑问题。

- 第一个条件 `if (n / 2 == 1 && n % 2 == 0)` 是多余的,因为当 `n` 为2时,这个条件成立,但后续的递归已经能处理这种情况。这个条件反而可能干扰其他情况,比如 `n` 为0时,`n/2==0` 不等于1,但0不是2的幂次方,代码没有处理0的情况。
- 当 `n` 为0时,递归会无限进行,因为 `n%2==0` 成立,但 `n/2` 仍然是0,导致无限递归。你需要考虑0这个特殊输入,它应该返回0(不是2的幂次方)。

提示:
- 检查当输入为0时,函数的行为是什么,并思考如何避免无限递归。
- 考虑简化递归的终止条件,通常2的幂次方递归到最后会得到1,但需要先排除0和负数的情况。