Números de 1 a n bits sin 1 consecutivos en representación binaria.

Dado un número n, nuestra tarea es encontrar todos los números de 1 a n bits sin 1 consecutivos en su representación binaria. 
Ejemplos: 
 

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

Agregamos bits uno por uno e imprimimos números recursivamente. Hasta el último bit, tenemos dos opciones. 
 

   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.

Usaremos la recursividad- 
 

  1. Hacemos un vector solución sol e insertamos el primer bit 1 en él, que será el primer número.
  2. Ahora comprobamos si la longitud del vector solución es menor o igual que n o no.
  3. Si es así, calculamos el número decimal y lo almacenamos en un mapa, ya que almacena números ordenados.
  4. Ahora tendremos dos condiciones- 
    • si el último dígito en sol es 0, podemos insertar 0 o 1 y repetir.
    • de lo contrario, si el último dígito es 1, podemos insertar solo 0 y repetir.
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>

Producción : 
 

1 2 4 5 8 9 10

Complejidad de tiempo: O (nlogn)

Espacio Auxiliar: O(n)

Publicación relacionada: 
Cuente el número de strings binarias sin 1 consecutivos
Este artículo es una contribución de Niteesh Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *