请使用递归和非递归两种方法完成下面问题的编程: 给你一个整数 n,请你判断该整数是否是 2的幂次方。如果是,返回 true(或1);否 则,返回 false(或0).
时间: 2024-09-13 09:09:23 浏览: 58
判断一个整数是否是2的幂次方,可以通过递归和非递归两种方法来实现。以下是两种方法的介绍:
递归方法:
递归方法是通过将问题分解为更小的子问题,直到达到基本情况。对于判断是否为2的幂次方的问题,我们可以通过不断地将数字除以2,直到它不再是2的倍数或减少到1。如果最终结果是1,则原数是2的幂次方;否则不是。
```c
#include <stdio.h>
#include <stdbool.h>
bool isPowerOfTwoRecursive(int n) {
if (n <= 0) {
return false;
}
if (n == 1) {
return true;
}
if (n % 2 != 0) {
return false;
}
return isPowerOfTwoRecursive(n / 2);
}
int main() {
int n = 8;
if (isPowerOfTwoRecursive(n)) {
printf("是2的幂次方\n");
} else {
printf("不是2的幂次方\n");
}
return 0;
}
```
非递归方法:
非递归方法是指使用循环结构来解决问题,不需要递归调用。对于判断是否为2的幂次方的问题,我们可以通过不断将数字右移(即除以2),直到数字变为0。如果在过程中数字变为1,则原数是2的幂次方;否则不是。还可以通过检查 n 与 n-1 的按位与操作是否为0,因为2的幂次方减去1后所有位都会变为0,仅最后一位是1。
```c
#include <stdio.h>
#include <stdbool.h>
bool isPowerOfTwoIterative(int n) {
if (n <= 0) {
return false;
}
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
int main() {
int n = 8;
if (isPowerOfTwoIterative(n)) {
printf("是2的幂次方\n");
} else {
printf("不是2的幂次方\n");
}
return 0;
}
```
请注意,上述两种方法都假设输入的整数是正整数。在实际应用中,还应该对输入的整数进行验证,确保其为正数。
阅读全文