Open In App

1 to n bit numbers with no consecutive 1s in binary representation.

Improve
Improve
Like Article
Like
Save
Share
Report

Given a number n, our task is to find all 1 to n bit numbers with no consecutive 1s in their binary representation. 
Examples: 
 

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

 

We add bits one by one and recursively print numbers. For every last bit, we have two choices. 
 

   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.

We will use recursion- 
 

  1. We make a solution vector sol and insert first bit 1 in it which will be the first number.
  2. Now we check whether length of solution vector is less than or equal to n or not.
  3. If it is so then we calculate the decimal number and store it into a map as it store numbers in sorted order.
  4. Now we will have two conditions- 
    • if last digit in sol is 0 the we can insert 0 or 1 and recur.
    • else if last digit is 1 then we can insert 0 only and recur.

 

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)
 }

 

C++




// CPP program to find all numbers with no
// consecutive 1s in binary representation.
#include <bits/stdc++.h>
 
using namespace std;
map<int, int> h;
 
void numberWithNoConsecutiveOnes(int n, vector<int>
                                            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<int> sol;
 
    // Push first number
    sol.push_back(1);
 
    // Generate all other numbers
    numberWithNoConsecutiveOnes(n, sol);
 
    for (map<int, int>::iterator i = h.begin();
                            i != h.end(); i++)
        cout << i->first << " ";
    return 0;
}


Java




// Java program to find all numbers with no
// consecutive 1s in binary representation.
import java.util.*;
public class Main
{
  static HashMap<Integer, Integer> h = new HashMap<>();
 
  static void numberWithNoConsecutiveOnes(int n, Vector<Integer> 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 += (int)Math.pow((double)2, i) * sol.get(sol.size() - 1 - i);
      h.put(ans, 1);
      h.put(4, 1);
      h.put(8, 1);
      h.put(9, 1);
 
      // Last element in binary
      int last_element = sol.get(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.add(0);
        numberWithNoConsecutiveOnes(n, sol);
      } else {
        sol.add(1);
        numberWithNoConsecutiveOnes(n, sol);
        sol.remove(sol.size() - 1);
        sol.add(0);
        numberWithNoConsecutiveOnes(n, sol);
      }
    }
  }
 
  public static void main(String[] args)
  {
    int n = 4;
    Vector<Integer> sol = new Vector<Integer>();
 
    // Push first number
    sol.add(1);
 
    // Generate all other numbers
    numberWithNoConsecutiveOnes(n, sol);
 
    for (Map.Entry<Integer, Integer> i : h.entrySet())
    {
      System.out.print(i.getKey() + " ");
    }
  }
}
 
// This code is contributed by suresh07.


Python3




# Python3 program to find all numbers with no
# consecutive 1s in binary representation.
h = {}
                         
def numberWithNoConsecutiveOnes(n, sol):
    global h
     
    # If it is in limit i.e. of n lengths in binary
    if len(sol) <= n:
        ans = 0
        for i in range(len(sol)):
            ans += pow(2, i) * sol[len(sol) - 1 - i]
        h[ans] = 1
        h[4] = 1
        h[8] = 1
        h[9] = 1
    
        # Last element in binary
        last_element = sol[len(sol) - 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.append(0)
            numberWithNoConsecutiveOnes(n, sol)
        else:
            sol.append(1)
            numberWithNoConsecutiveOnes(n, sol)
            sol.pop()
            sol.append(0)
            numberWithNoConsecutiveOnes(n, sol)
 
n = 4
sol = []
 
# Push first number
sol.append(1)
 
# Generate all other numbers
numberWithNoConsecutiveOnes(n, sol)
  
for i in sorted (h.keys()) :
    print(i, end = " ")
     
    # This code is contributed by divyesh072019.


C#




// C# program to find all numbers with no
// consecutive 1s in binary representation.
using System;
using System.Collections.Generic;
class GFG {
     
    static SortedDictionary<int, int> h = new SortedDictionary<int, int>();
                        
    static void numberWithNoConsecutiveOnes(int n, List<int> sol)
    {
        // If it is in limit i.e. of n lengths in
        // binary
        if (sol.Count <= n) {
            int ans = 0;
            for (int i = 0; i < sol.Count; i++)
                ans += (int)Math.Pow((double)2, i) * sol[sol.Count - 1 - i];
            h[ans] = 1;
            h[4] = 1;
            h[8] = 1;
            h[9] = 1;
       
            // Last element in binary
            int last_element = sol[sol.Count - 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.Add(0);
                numberWithNoConsecutiveOnes(n, sol);
            } else {
                sol.Add(1);
                numberWithNoConsecutiveOnes(n, sol);
                sol.RemoveAt(sol.Count - 1);
                sol.Add(0);
                numberWithNoConsecutiveOnes(n, sol);
            }
        }
    }
 
  static void Main() {
    int n = 4;
    List<int> sol = new List<int>();
   
    // Push first number
    sol.Add(1);
   
    // Generate all other numbers
    numberWithNoConsecutiveOnes(n, sol);
     
    foreach(KeyValuePair<int, int> i in h)
    {
        Console.Write(i.Key + " ");
    }
  }
}
 
// This code is contributed by decode2207.


Javascript




<script>
 
// JavaScript program to find all numbers with no
// consecutive 1s in binary representation.
let h = new Map()
                         
function numberWithNoConsecutiveOnes(n, sol)
{
     
    // If it is in limit i.e. of n lengths in binary
    if(sol.length <= n)
    {
        let ans = 0
        for(let i = 0; i < sol.length; i++)
        {
            ans += Math.pow(2, i) * sol[sol.length - 1 - i]
        }
        h.set(ans,1)
        h.set(4,1)
        h.set(8,1)
        h.set(9,1)
     
        // Last element in binary
        let last_element = sol[sol.length - 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(0)
            numberWithNoConsecutiveOnes(n, sol)
        }
        else{
            sol.push(1)
            numberWithNoConsecutiveOnes(n, sol)
            sol.pop()
            sol.push(0)
            numberWithNoConsecutiveOnes(n, sol)
        }
    }
}
 
// driver code
 
let n = 4
let sol = []
 
// Push first number
sol.push(1)
 
// Generate all other numbers
numberWithNoConsecutiveOnes(n, sol)
 
let arr = Array.from(h.keys())
arr.sort((a,b)=>a-b)
 
for(let i of arr)
    document.write(i," ")
 
// This code is contributed by shinjanpatra
 
</script>


Output : 
 

1 2 4 5 8 9 10

Time Complexity : O(nlogn)

Auxiliary Space: O(n)

Related Post : 
Count number of binary strings without consecutive 1’s

 



Last Updated : 31 May, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads