c++请使用递归和非递归两种方法完成下面问题的编程: 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true(或1) ;否则,返回 false(或0)
时间: 2024-09-12 09:11:16 浏览: 52
在 C++ 中,我们可以使用递归和非递归两种方法来判断一个整数是否是 2 的幂次方。
**递归方法:**
```cpp
#include <cmath>
bool isPowerOfTwo(int n, int base = 2) {
if (n <= 0) return false;
else if (n == 1) return true;
else return isPowerOfTwo(n / base);
}
```
在这个递归函数中,每次将 `n` 除以底数 `base`(默认为2),如果 `n` 变成了 1,则说明它是 2 的幂次方,返回 `true`;否则继续递归检查 `n / base` 是否等于 1。
**非递归方法(位运算):**
```cpp
#include <iostream>
bool isPowerOfTwo(int n) {
// 使用按位与操作 & 和移位操作 << 来检查最右边的位是否全为1,并且只剩一位1
return n && !(n & (n - 1));
}
```
这里我们使用 `&` 运算符获取二进制表示中最右侧的那个1(如果存在的话),然后用 `n - 1` 将这个1变为0,再与原数比较。如果结果不为0,则说明不是 2 的幂次方。
相关问题
用c++写编程:输入一个非负整数n的值(n不超过20),编程输出n!(n的阶乘)。程序中的整数请定义成long long型。请定义递归函数计算阶乘。
这是一个关于编程的问题。好的,我可以回答这个问题。以下是计算阶乘的C代码:
#include <stdio.h>
long long factorial(int n) {
if (n == 0) { // base case
return 1;
} else {
return n * factorial(n-1);
}
}
int main() {
int n;
printf("请输入一个非负整数n的值(n不超过20): ");
scanf("%d", &n);
printf("%d! = %lld", n, factorial(n));
return 0;
}
输入非负整数n的值,递归计算n的阶乘,并输出结果。注意,为了防止数值溢出,程序中整数类型定义为long long型。
请你编写一个C++递归的代码:问题描述: 有N阶楼梯,每次可以1步,也可以2步,走完这N阶楼梯有多少种不同方法? 输入描述: 输入个正整数N,表示有多少阶楼梯 输出描述: 输出一个正整数,表示可以有这么多方法 输入样例: 3 输出样例: 3
以下是一个使用递归方法解决楼梯问题的C++代码:
```cpp
#include <iostream>
int countWays(int n) {
if (n <= 1) {
return 1; // 当楼梯阶数为0或1时,只有一种方法
}
else {
return countWays(n - 1) + countWays(n - 2); // 使用递归计算n-1阶和n-2阶楼梯的方法数之和
}
}
int main() {
int n;
std::cout << "请输入楼梯阶数: ";
std::cin >> n;
int ways = countWays(n);
std::cout << "有 " << ways << " 种不同方法" << std::endl;
return 0;
}
```
希望对你有所帮助!如果还有其他问题,请随时提问。
阅读全文