给定一个正数N ,任务是找出小于或等于给定数N 的所有 2 的完美幂。
例子:
Input: N = 63
Output: 32 16 8 4 2 1
Explanation:
There are total of 6 powers of 2, which are less than or equal to the given number N.
Input: N = 193
Output: 128 64 32 16 8 4 2 1
Explaination:
There are total of 8 powers of 2, which are less than or equal to the given number N.
朴素的方法:这个想法是遍历从 N 到 1 的每个数字,并检查它是否是 2 的完美幂。如果是,则打印该数字。
另一种方法:这个想法是找到 2 的所有幂,然后简单地打印小于或等于 N 的幂。
另一种方法:这个想法基于这样一个概念,即所有 2 的幂都以二进制形式设置所有位。这种方法使用Bitset函数来解决上述问题。以下是步骤:
- 找到用于评估小于或等于N的数字的 2 的最大幂(比如temp )。
- 初始化一个最大大小为64 的位集数组arr[] ,以存储给定数字N的二进制表示。
- 使用 reset()函数重置 bitset 数组中的所有位。
- 迭代一个从total 到 0的循环,并依次使每个位为1 ,并找到该二进制表达式的值,然后重置该位。
下面是上述方法的实现:
// C++ program for the above approach
#include
using namespace std;
const int MAX = 64;
// Function to return max exponent of
// 2 which evaluates a number less
// than or equal to N
int max_exponent(int n)
{
return (int)(log2(n));
}
// Function to print all the powers
// of 2 less than or equal to N
void all_powers(int N)
{
bitset<64> arr(N);
// Reset all the bits
arr.reset();
int total = max_exponent(N);
// Iterate from total to 0
for (int i = total; i >= 0; i--) {
// Reset the next bit
arr.reset(i + 1);
// Set the current bit
arr.set(i);
// Value of the binary expression
cout << arr.to_ulong() << " ";
}
}
// Driver Code
int main()
{
// Given Number
int N = 63;
// Function Call
all_powers(N);
return 0;
}
输出:
32 16 8 4 2 1
时间复杂度: O(log N)
辅助空间: O(1)