Last Updated on March 23, 2022 by Ria Pathak
CONCEPTS USED:
Recursion
DIFFICULTY LEVEL:
Medium
PROBLEM STATEMENT(SIMPLIFIED):
Given a number N, your task is to print all possible permutations of its
Binary Representation
.NOTE : Print the output in the lexicographically sorted form.
See original problem statement here
For Example :
Input : N = 5
Output : 011 101 110
Explanation :
Binary Representation of 5 is 101 and all permutations of it i.e. 011 101 110 are printed in a lexicographic order.
SOLVING APPROACH:
- Start by finding the number of zeros and ones present in the
Binary Representation
of N and store them inones
andzeros
.- Initialize an empty string
str
for storing all such combinations one-by-one.- If
ones
= 0, append all thezeros
tostr
and print it. Else ifzeros
= 0, append allones
tostr
and print it.- Else recursively keep appending a 0 to
str
and reducezeros
by 1. Similarly recursively keep appending a 1 tostr
and reduceones
by 1 till allzeros
andones
are appended in thestr
and its size becomes equal to size of theBinary Representation
of the number N.
ILLUSTRATION :
N = 5
Binary Representation of 5 = 101
Zeros = 1
Ones = 2
str = ""
Since Zeros and Ones both are not 0, append 0 to str and reduce Zeros by 1
str = "0"
Zeros = 0
Since Zeros = 0, append all remaining 1's to str
str = "011"
Ones = 0
Since Zeros = Ones = 0
print the str i.e. our first valid permutation of Binary Representation of 5.
Similarly print all such permutations recursively.
SOLUTIONS:
#include <bits/stdc++.h>
using namespace std;
/* function for finding all such combinations */
void permutation(int no_ones, int no_zeroes, string accum,vector<string>&perm){
if(no_ones == 0){
for(int i=0;i<no_zeroes;i++){
accum += "0";
}
perm.push_back(accum);
return;
}
else if(no_zeroes == 0){
for(int j=0;j<no_ones;j++){
accum += "1";
}
perm.push_back(accum);
return;
}
permutation (no_ones - 1, no_zeroes, accum + "1",perm);
permutation (no_ones , no_zeroes - 1, accum + "0",perm);
}
int main(){
int t;
cin>>t;
while(t--){
int n, ones = 0, zeros = 0;
cin>>n;
/* finding number of zeros and ones in the number */
while(n>0)
{
if(n&1)
ones++;
else
zeros++;
n =n>>1;
}
//initializing an empty string
string append = "";
//vector of strings to store all the combinations
vector<string>perm;
permutation(ones, zeros, append, perm);
/* sort all combinations in ascending order */
sort(perm.begin(),perm.end());
for(int i=0;i<perm.size();i++)
cout<<perm[i]<<" ";
}
}
#include <bits/stdc++.h>
using namespace std;
/* function for finding all such combinations */
void permutation(int no_ones, int no_zeroes, string accum,vector<string>&perm){
if(no_ones == 0){
for(int i=0;i<no_zeroes;i++){
accum += "0";
}
perm.push_back(accum);
return;
}
else if(no_zeroes == 0){
for(int j=0;j<no_ones;j++){
accum += "1";
}
perm.push_back(accum);
return;
}
permutation (no_ones - 1, no_zeroes, accum + "1",perm);
permutation (no_ones , no_zeroes - 1, accum + "0",perm);
}
int main(){
int t;
cin>>t;
while(t--){
int n, ones = 0, zeros = 0;
cin>>n;
/* finding number of zeros and ones in the number */
while(n>0)
{
if(n&1)
ones++;
else
zeros++;
n =n>>1;
}
//initializing an empty string
string append = "";
//vector of strings to store all the combinations
vector<string>perm;
permutation(ones, zeros, append, perm);
/* sort all combinations in ascending order */
sort(perm.begin(),perm.end());
for(int i=0;i<perm.size();i++)
cout<<perm[i]<<" ";
}
}
#include <bits/stdc++.h> using namespace std; /* function for finding all such combinations */ void permutation(int no_ones, int no_zeroes, string accum,vector<string>&perm){ if(no_ones == 0){ for(int i=0;i<no_zeroes;i++){ accum += "0"; } perm.push_back(accum); return; } else if(no_zeroes == 0){ for(int j=0;j<no_ones;j++){ accum += "1"; } perm.push_back(accum); return; } permutation (no_ones - 1, no_zeroes, accum + "1",perm); permutation (no_ones , no_zeroes - 1, accum + "0",perm); } int main(){ int t; cin>>t; while(t--){ int n, ones = 0, zeros = 0; cin>>n; /* finding number of zeros and ones in the number */ while(n>0) { if(n&1) ones++; else zeros++; n =n>>1; } //initializing an empty string string append = ""; //vector of strings to store all the combinations vector<string>perm; permutation(ones, zeros, append, perm); /* sort all combinations in ascending order */ sort(perm.begin(),perm.end()); for(int i=0;i<perm.size();i++) cout<<perm[i]<<" "; } }
import java.util.*;
import java.io.*;
public class Main {
/* function for finding all such combinations */
static void permutation(int no_ones, int no_zeroes, String accum, ArrayList<String> perm){
if(no_ones == 0){
for(int i=0;i<no_zeroes;i++){
accum += "0";
}
perm.add(accum);
return;
}
else if(no_zeroes == 0){
for(int j=0;j<no_ones;j++){
accum += "1";
}
perm.add(accum);
return;
}
permutation (no_ones - 1, no_zeroes, accum + "1",perm);
permutation (no_ones , no_zeroes - 1, accum + "0",perm);
}
public static void main(String args[]) throws IOException {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t != 0){
int n = sc.nextInt();
int ones = 0, zeros = 0;
/* finding number of zeros and ones in the number */
while(n>0)
{
if(n%2 == 0)
zeros++;
else
ones++;
n /= 2;
}
//initializing an empty string
String append = "";
//vector of strings to store all the combinations
//vector<string>perm;
ArrayList<String> perm = new ArrayList<String>();
permutation(ones, zeros, append, perm);
/* sort all combinations in ascending order */
Collections.sort(perm);
for(int i=0;i<perm.size();i++)
System.out.print(perm.get(i) + " ");
System.out.println();
t--;
}
}
}
}
import java.util.*;
import java.io.*;
public class Main {
/* function for finding all such combinations */
static void permutation(int no_ones, int no_zeroes, String accum, ArrayList<String> perm){
if(no_ones == 0){
for(int i=0;i<no_zeroes;i++){
accum += "0";
}
perm.add(accum);
return;
}
else if(no_zeroes == 0){
for(int j=0;j<no_ones;j++){
accum += "1";
}
perm.add(accum);
return;
}
permutation (no_ones - 1, no_zeroes, accum + "1",perm);
permutation (no_ones , no_zeroes - 1, accum + "0",perm);
}
public static void main(String args[]) throws IOException {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t != 0){
int n = sc.nextInt();
int ones = 0, zeros = 0;
/* finding number of zeros and ones in the number */
while(n>0)
{
if(n%2 == 0)
zeros++;
else
ones++;
n /= 2;
}
//initializing an empty string
String append = "";
//vector of strings to store all the combinations
//vector<string>perm;
ArrayList<String> perm = new ArrayList<String>();
permutation(ones, zeros, append, perm);
/* sort all combinations in ascending order */
Collections.sort(perm);
for(int i=0;i<perm.size();i++)
System.out.print(perm.get(i) + " ");
System.out.println();
t--;
}
}
}
}
import java.util.*; import java.io.*; public class Main { /* function for finding all such combinations */ static void permutation(int no_ones, int no_zeroes, String accum, ArrayList<String> perm){ if(no_ones == 0){ for(int i=0;i<no_zeroes;i++){ accum += "0"; } perm.add(accum); return; } else if(no_zeroes == 0){ for(int j=0;j<no_ones;j++){ accum += "1"; } perm.add(accum); return; } permutation (no_ones - 1, no_zeroes, accum + "1",perm); permutation (no_ones , no_zeroes - 1, accum + "0",perm); } public static void main(String args[]) throws IOException { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while(t != 0){ int n = sc.nextInt(); int ones = 0, zeros = 0; /* finding number of zeros and ones in the number */ while(n>0) { if(n%2 == 0) zeros++; else ones++; n /= 2; } //initializing an empty string String append = ""; //vector of strings to store all the combinations //vector<string>perm; ArrayList<String> perm = new ArrayList<String>(); permutation(ones, zeros, append, perm); /* sort all combinations in ascending order */ Collections.sort(perm); for(int i=0;i<perm.size();i++) System.out.print(perm.get(i) + " "); System.out.println(); t--; } } } }
def permutation(no_ones, no_zeroes, accum, perm):
if(no_ones == 0):
for i in range(no_zeroes):
accum = accum + "0"
perm.append(accum)
return
elif(no_zeroes == 0):
for j in range(no_ones):
accum = accum + "1"
perm.append(accum)
return
permutation (no_ones - 1, no_zeroes, accum + "1", perm)
permutation (no_ones , no_zeroes - 1, accum + "0", perm)
for _ in range(int(input())):
n = int(input())
ones, zeros = 0, 0
while n>0:
if n & 1:
ones += 1
else:
zeros += 1
n = n >> 1
a = ""
perm = []
permutation(ones, zeros, a, perm)
perm.sort()
print(*perm)
def permutation(no_ones, no_zeroes, accum, perm):
if(no_ones == 0):
for i in range(no_zeroes):
accum = accum + "0"
perm.append(accum)
return
elif(no_zeroes == 0):
for j in range(no_ones):
accum = accum + "1"
perm.append(accum)
return
permutation (no_ones - 1, no_zeroes, accum + "1", perm)
permutation (no_ones , no_zeroes - 1, accum + "0", perm)
for _ in range(int(input())):
n = int(input())
ones, zeros = 0, 0
while n>0:
if n & 1:
ones += 1
else:
zeros += 1
n = n >> 1
a = ""
perm = []
permutation(ones, zeros, a, perm)
perm.sort()
print(*perm)
def permutation(no_ones, no_zeroes, accum, perm): if(no_ones == 0): for i in range(no_zeroes): accum = accum + "0" perm.append(accum) return elif(no_zeroes == 0): for j in range(no_ones): accum = accum + "1" perm.append(accum) return permutation (no_ones - 1, no_zeroes, accum + "1", perm) permutation (no_ones , no_zeroes - 1, accum + "0", perm) for _ in range(int(input())): n = int(input()) ones, zeros = 0, 0 while n>0: if n & 1: ones += 1 else: zeros += 1 n = n >> 1 a = "" perm = [] permutation(ones, zeros, a, perm) perm.sort() print(*perm)
[forminator_quiz id="1001"]
This article tried to discuss Recursion. Hope this blog helps you understand and solve the problem. To practice more problems on Recursion you can check out MYCODE | Competitive Programming.
If one consider solving it by using strings then it could be made easier.
#include
using namespace std;
void binaryPattern(string op, int zero, int one)
{
if (!one && !zero)
{
cout << op <0)
{
if (n%2 == binary) count++;
n/=2;
}
return count;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
while(t–)
{
int n;
cin >> n;
int zero = getCount(n, 0);
int one = getCount(n, 1);
binaryPattern(“”, zero, one);
cout << endl;
}
}