Print numbers in the range 1 to n having bits in alternate pattern
Last Updated :
15 Jun, 2022
Given a positive integer n. The problem is to print the numbers in the range 1 to n having bits in alternate pattern. Here alternate pattern means that the set and unset bits in the number occur in alternate order. For example- 5 has an alternate pattern i.e. 101.
Examples:
Input : n = 10
Output : 1 2 5 10
Input : n = 50
Output : 1 2 5 10 21 42
Method 1 (Naive Approach): Generate all the numbers in the range 1 to n and for each generated number check whether it has bits in alternate pattern. Time Complexity is of O(n).
Method 2 (Efficient Approach): Algorithm:
printNumHavingAltBitPatrn(n)
Initialize curr_num = 1
print curr_num
while (1)
curr_num <<= 1
if n < curr_num then
break
print curr_num
curr_num = ((curr_num) << 1) ^ 1
if n < curr_num then
break
print curr_num
CPP
#include <bits/stdc++.h>
using namespace std;
void printNumHavingAltBitPatrn( int n)
{
int curr_num = 1;
cout << curr_num << " " ;
while (1) {
curr_num <<= 1;
if (n < curr_num)
break ;
cout << curr_num << " " ;
curr_num = ((curr_num) << 1) ^ 1;
if (n < curr_num)
break ;
cout << curr_num << " " ;
}
}
int main()
{
int n = 50;
printNumHavingAltBitPatrn(n);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
public static void printNumHavingAltBitPatrn( int n)
{
int curr_num = 1, i = 1;
System.out.print(curr_num + " " );
while (i!=0)
{
i++;
curr_num <<= 1;
if (n < curr_num)
break ;
System.out.print(curr_num + " " );
curr_num = ((curr_num) << 1) ^ 1;
if (n < curr_num)
break ;
System.out.print(curr_num + " " );
}
}
public static void main (String[] args)
{
int n = 50;
printNumHavingAltBitPatrn(n);
}
}
|
Python3
def printNumHavingAltBitPatrn(n):
curr_num = 1
print (curr_num)
while ( 1 ) :
curr_num = curr_num << 1 ;
if (n < curr_num):
break ;
print ( curr_num )
curr_num = ((curr_num) << 1 ) ^ 1 ;
if (n < curr_num):
break
print ( curr_num )
n = 50
printNumHavingAltBitPatrn(n)
|
C#
using System;
class GFG {
public static void printNumHavingAltBitPatrn( int n)
{
int curr_num = 1, i = 1;
Console.Write(curr_num + " " );
while (i!=0)
{
curr_num <<= 1;
if (n < curr_num)
break ;
Console.Write(curr_num + " " );
curr_num = ((curr_num) << 1) ^ 1;
if (n < curr_num)
break ;
Console.Write(curr_num + " " );
}
}
public static void Main ()
{
int n = 50;
printNumHavingAltBitPatrn(n);
}
}
|
PHP
<?php
function printNumHavingAltBitPatrn( $n )
{
$curr_num = 1;
echo $curr_num . " " ;
while (1)
{
$curr_num <<= 1;
if ( $n < $curr_num )
break ;
echo $curr_num . " " ;
$curr_num = (( $curr_num ) << 1) ^ 1;
if ( $n < $curr_num )
break ;
echo $curr_num . " " ;
}
}
$n = 50;
printNumHavingAltBitPatrn( $n );
?>
|
Javascript
<script>
function printNumHavingAltBitPatrn(n)
{
var curr_num = 1;
document.write(curr_num + " " );
while ( true ) {
curr_num <<= 1;
if (n < curr_num)
break ;
document.write(curr_num + " " );
curr_num = ((curr_num) << 1) ^ 1;
if (n < curr_num)
break ;
document.write(curr_num + " " );
}
}
var n = 50;
printNumHavingAltBitPatrn(n);
</script>
|
Output:
1 2 5 10 21 42
Time Complexity: O(log n)
Space Complexity: O(1)
Share your thoughts in the comments
Please Login to comment...