c语言使用递归和非递归两种方法完成下面问题的编程: 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true(或1) ;否则,返回 false(或0) 。
时间: 2024-09-12 15:11:50 浏览: 20
在C语言中,判断一个整数n是否是2的幂次方可以通过递归和非递归两种方法来实现。
首先是递归方法,递归的核心思想是如果n是2的幂次方,那么n必定大于0,并且n除以2的商也是一个较小的2的幂次方,直到n等于1。递归函数会不断地将n除以2,直到找到答案。
```c
#include <stdio.h>
int isPowerOfTwoRecursive(int n) {
if (n <= 0) return 0; // 2的幂次方必须大于0
if (n == 1) return 1; // 1是2的0次幂
if (n % 2 != 0) return 0; // 如果n不是偶数,则不是2的幂次方
return isPowerOfTwoRecursive(n / 2); // 递归调用
}
int main() {
int number;
printf("请输入一个整数:");
scanf("%d", &number);
if (isPowerOfTwoRecursive(number)) {
printf("%d 是 2 的幂次方。\n", number);
} else {
printf("%d 不是 2 的幂次方。\n", number);
}
return 0;
}
```
接下来是非递归方法,使用位运算来判断。如果n是2的幂次方,那么n必定只有一个位是1,其余位都是0。可以通过n与n-1的按位与运算来检查,如果结果为0,则说明n是2的幂次方。
```c
#include <stdio.h>
int isPowerOfTwoNonRecursive(int n) {
if (n <= 0) return 0; // 2的幂次方必须大于0
return (n & (n - 1)) == 0; // 按位与运算,如果结果为0,则n是2的幂次方
}
int main() {
int number;
printf("请输入一个整数:");
scanf("%d", &number);
if (isPowerOfTwoNonRecursive(number)) {
printf("%d 是 2 的幂次方。\n", number);
} else {
printf("%d 不是 2 的幂次方。\n", number);
}
return 0;
}
```
这两种方法都能够有效地解决问题。递归方法易于理解,但可能会因为递归深度过大而导致栈溢出;非递归方法通常效率更高,因为它避免了函数调用的开销。