请使用递归和非递归两种方法完成下面问题的编程:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true(或1) ;否则,返回 false(或0) 。运用c语言
时间: 2024-09-12 17:09:34 浏览: 34
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
要判断一个整数n是否是2的幂次方,我们可以使用递归和非递归两种方法。以下是使用C语言实现的两种方法:
递归方法:
递归方法的思路是不断地将n除以2,直到n为1(此时是2的0次方)或者n不能被2整除为止。如果最后n为1,那么它就是2的幂次方。
```c
#include <stdio.h>
int isPowerOfTwoRecursive(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
if (n % 2 != 0) return 0;
return isPowerOfTwoRecursive(n / 2);
}
int main() {
int n;
scanf("%d", &n);
if (isPowerOfTwoRecursive(n)) {
printf("true\n");
} else {
printf("false\n");
}
return 0;
}
```
非递归方法:
非递归方法通常利用位运算。因为如果一个数是2的幂,那么它的二进制表示中只有一个1,其余都是0。那么如果一个数是2的幂,它减1之后就与原数进行按位与操作,结果必定为0。
```c
#include <stdio.h>
int isPowerOfTwoIterative(int n) {
if (n <= 0) return 0;
return (n & (n - 1)) == 0;
}
int main() {
int n;
scanf("%d", &n);
if (isPowerOfTwoIterative(n)) {
printf("true\n");
} else {
printf("false\n");
}
return 0;
}
```
在这两段代码中,我们都是首先对输入的整数n进行检查,如果n小于等于0,直接返回false。然后,分别用递归和非递归的方式判断n是否是2的幂。
阅读全文