📌  相关文章
📜  找出小于或等于给定数字的所有 2 的幂

📅  最后修改于: 2021-09-04 09:37:07             🧑  作者: Mango

给定一个正数N ,任务是找出小于或等于给定数N 的所有 2 的完美幂。

例子:

朴素的方法:这个想法是遍历从 N 到 1 的每个数字,并检查它是否是 2 的完美幂。如果是,则打印该数字。

另一种方法:这个想法是找到 2 的所有幂,然后简单地打印小于或等于 N 的幂。

另一种方法:这个想法基于这样一个概念,即所有 2 的幂都以二进制形式设置所有位。这种方法使用Bitset函数来解决上述问题。以下是步骤:

  1. 找到用于评估小于或等于N的数字的 2 的最大幂(比如temp )。
  2. 初始化一个最大大小为64 的位集数组arr[] ,以存储给定数字N的二进制表示。
  3. 使用 reset()函数重置 bitset 数组中的所有位。
  4. 迭代一个从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)