All possible binary numbers of length n with equal sum in both halves
Last Updated :
30 Oct, 2022
Given a number n, we need to print all n-digit binary numbers with equal sum in left and right halves. If n is odd, then mid element can be either 0 or 1.
Examples:
Input : n = 4
Output : 0000 0101 0110 1001 1010 1111
Input : n = 5
Output : 00000 00100 01001 01101 01010 01110 10001 10101 10010 10110 11011 11111
The idea is to recursively build left and right halves and keep track of the difference between counts of 1s in them. We print a string when the difference becomes 0 and there are no more characters to add.
C++
#include <bits/stdc++.h>
using namespace std;
void equal( int n, string left= "" , string right= "" ,
int di=0)
{
if (n == 0)
{
if (di == 0)
cout << left + right << " " ;
return ;
}
if (n == 1)
{
if (di == 0)
{
cout << left + "0" + right << " " ;
cout << left + "1" + right << " " ;
}
return ;
}
if ((2 * abs (di) <= n))
{
equal(n-2, left+ "0" , right+ "0" , di);
equal(n-2, left+ "0" , right+ "1" , di-1);
equal(n-2, left+ "1" , right+ "0" , di+1);
equal(n-2, left+ "1" , right+ "1" , di);
}
}
int main()
{
int n = 5;
equal(n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void equal( int n, String left,
String right, int di)
{
if (n == 0 )
{
if (di == 0 )
System.out.print(left + right + " " );
return ;
}
if (n == 1 )
{
if (di == 0 )
{
System.out.print(left + "0" + right + " " );
System.out.print(left + "1" + right + " " );
}
return ;
}
if (( 2 * Math.abs(di) <= n))
{
equal(n - 2 , left + "0" , right + "0" , di);
equal(n - 2 , left + "0" , right + "1" , di - 1 );
equal(n - 2 , left + "1" , right + "0" , di + 1 );
equal(n - 2 , left + "1" , right + "1" , di);
}
}
public static void main(String args[])
{
int n = 5 ;
equal(n, "" , "" , 0 );
}
}
|
Python3
def equal(n: int , left = " ", right = " ", di = 0 ):
if n = = 0 :
if di = = 0 :
print (left + right, end = " " )
return
if n = = 1 :
if di = = 0 :
print (left + "0" + right, end = " " )
print (left + "1" + right, end = " " )
return
if 2 * abs (di) < = n:
equal(n - 2 , left + "0" , right + "0" , di)
equal(n - 2 , left + "0" , right + "1" , di - 1 )
equal(n - 2 , left + "1" , right + "0" , di + 1 )
equal(n - 2 , left + "1" , right + "1" , di)
if __name__ = = "__main__" :
n = 5
equal( 5 )
|
C#
using System;
class GFG
{
static void equal( int n, String left,
String right, int di)
{
if (n == 0)
{
if (di == 0)
Console.Write(left + right + " " );
return ;
}
if (n == 1)
{
if (di == 0)
{
Console.Write(left + "0" +
right + " " );
Console.Write(left + "1" +
right + " " );
}
return ;
}
if ((2 * Math.Abs(di) <= n))
{
equal(n - 2, left + "0" , right + "0" , di);
equal(n - 2, left + "0" ,
right + "1" , di - 1);
equal(n - 2, left + "1" ,
right + "0" , di + 1);
equal(n - 2, left + "1" , right + "1" , di);
}
}
public static void Main(String []args)
{
int n = 5;
equal(n, "" , "" , 0);
}
}
|
Javascript
<script>
function equal(n,left,right,di)
{
if (n == 0)
{
if (di == 0)
document.write(left + right + " " );
return ;
}
if (n == 1)
{
if (di == 0)
{
document.write(left + "0" + right + " " );
document.write(left + "1" + right + " " );
}
return ;
}
if ((2 * Math.abs(di) <= n))
{
equal(n - 2, left + "0" , right + "0" , di);
equal(n - 2, left + "0" , right + "1" , di - 1);
equal(n - 2, left + "1" , right + "0" , di + 1);
equal(n - 2, left + "1" , right + "1" , di);
}
}
let n = 5;
equal(n, "" , "" , 0);
</script>
|
Output
00000 00100 01001 01101 01010 01110 10001 10101 10010 10110 11011 11111
Share your thoughts in the comments
Please Login to comment...