📜  1到n位数字,二进制表示中没有连续的1。

📅  最后修改于: 2021-05-04 13:36:54             🧑  作者: Mango

给定一个数字n,我们的任务是找到所有1到n个二进制数,且它们的二进制表示形式中没有连续的1。

例子:

Input : n = 4
Output : 1 2 4 5 8 9 10
These are numbers with 1 to 4
bits and no consecutive ones in
binary representation.

Input : n = 3
Output : 1 2 4 5

我们将一位一位相加并递归地打印数字。对于最后一点,我们有两个选择。

if last digit in sol is 0 then
      we can insert 0 or 1 and recur. 
   else if last digit is 1 then
      we can insert 0 only and recur.

我们将使用递归-

  1. 我们制作一个解矢量sol,并在其中插入第一个位1,这将是第一个数字。
  2. 现在我们检查解向量的长度是否小于或等于n。
  3. 如果是这样,那么我们将计算十进制数字,并将其存储在地图中,因为它按排序顺序存储数字。
  4. 现在我们有两个条件:
    • 如果sol中的最后一位数字为0,我们可以插入0或1并重复出现。
    • 否则,如果最后一位是1,那么我们只能插入0并重复出现。
numberWithNoConsecutiveOnes(n, sol)
{
if sol.size() <= n
 
  //  calculate decimal and store it
  if last element of sol is 1
     insert 0 in sol 
     numberWithNoConsecutiveOnes(n, sol)
 else
     insert 1 in sol
     numberWithNoConsecutiveOnes(n, sol)

     // because we have to insert zero 
     // also in place of 1
     sol.pop_back();
     insert 0 in sol
     numberWithNoConsecutiveOnes(n, sol)
 }
// CPP program to find all numbers with no
// consecutive 1s in binary representation.
#include 
  
using namespace std;
map h;
  
void numberWithNoConsecutiveOnes(int n, vector 
                                              sol)
{
    // If it is in limit i.e. of n lengths in 
    // binary
    if (sol.size() <= n) {
        int ans = 0;
        for (int i = 0; i < sol.size(); i++)
            ans += pow((double)2, i) * 
                   sol[sol.size() - 1 - i];
        h[ans] = 1;
  
        // Last element in binary
        int last_element = sol[sol.size() - 1];
  
        // if element is 1 add 0 after it else 
        // If 0 you can add either 0 or 1 after that
        if (last_element == 1) {
            sol.push_back(0);
            numberWithNoConsecutiveOnes(n, sol);
        } else {
            sol.push_back(1);
            numberWithNoConsecutiveOnes(n, sol);
            sol.pop_back();
            sol.push_back(0);
            numberWithNoConsecutiveOnes(n, sol);
        }
    }
}
  
// Driver program
int main()
{
    int n = 4;
    vector sol;
  
    // Push first number
    sol.push_back(1);
  
    // Generate all other numbers
    numberWithNoConsecutiveOnes(n, sol);
  
    for (map::iterator i = h.begin();
                            i != h.end(); i++)
        cout << i->first << " ";
    return 0;
}

输出:

1 2 4 5 8 9 10

相关文章:
计算不带连续1的二进制字符串的数量