Given n, find the greatest number which is strictly not more then n and whose binary representation consists of m consecutive ones, then m-1 consecutive zeros and nothing else

**Examples:**

Input : n = 7 Output : 6 Explanation: 6's binary representation is 110, and 7's is 111, so 6 consists of 2 consecutive 1's and then 1 consecutive 0. Input : 130 Output : 120 Explanation: 28 and 120 are the only numbers <=120, 28 is 11100 consists of 3 consecutive 1's and then 2 consecutive 0's. 120 is 1111000 consists of 4 consecutive 1's and then 3 consecutive 0's. So 120 is the greatest of number<=120 which meets the given condition.

A **naive approach** will be to traverse from 1 to N and check for every binary representation which consists of m consecutive 1’s and m-1 consecutive 0’s and store the largest of them which meets the given condition.

An **efficient approach** is to observe a pattern of numbers,

[**1(1), 6(110), 28(11100), 120(1111000), 496(111110000), ….] **

To get the formula for the numbers which satisfies the conditions we take 120 as an example-

120 is represented as 1111000 which has m = 4 1’s and m = 3 0’s. Converting 1111000 to decimal we get:

2^3+2^4+2^5+2^6 which can be represented as (2^m-1 + 2^m+ 2^m+1 + … 2^m+2, 2^2*m)

2^3*(1+2+2^2+2^3) which can be represented as (2^(m-1)*(1+2+2^2+2^3+..2^(m-1))

2^3*(2^4-1) which can be represented as **[2^(m-1) * (2^m -1)].**

So all the numbers that meet the given condition can be represented as

[2^(m-1) * (2^m -1)]

We can iterate till the number does not exceeds N and print the largest of all possible elements. A closer observation will shows that at **m = 33 it will exceed the 10^18 mark **, so we are calculating the number in unit’s time as **log(32)** is near to constant which is required in calculating the **pow **.

So, the overall complexity will be O(1).

## C++

`// CPP program to find largest number ` `// smaller than equal to n with m set ` `// bits then m-1 0 bits. ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Returns largest number with m set ` `// bits then m-1 0 bits. ` `long` `long` `answer(` `long` `long` `n) ` `{ ` ` ` `// Start with 2 bits. ` ` ` `long` `m = 2; ` ` ` ` ` `// initial answer is 1 ` ` ` `// which meets the given condition ` ` ` `long` `long` `ans = 1; ` ` ` `long` `long` `r = 1; ` ` ` ` ` `// check for all numbers ` ` ` `while` `(r < n) { ` ` ` ` ` `// compute the number ` ` ` `r = (` `int` `)(` `pow` `(2, m) - 1) * (` `pow` `(2, m - 1)); ` ` ` ` ` `// if less then N ` ` ` `if` `(r < n) ` ` ` `ans = r; ` ` ` ` ` `// increment m to get the next number ` ` ` `m++; ` ` ` `} ` ` ` ` ` `return` `ans; ` `} ` ` ` `// driver code to check the above condition ` `int` `main() ` `{ ` ` ` `long` `long` `n = 7; ` ` ` `cout << answer(n); ` ` ` `return` `0; ` `} ` |

## Java

`// java program to find largest number ` `// smaller than equal to n with m set ` `// bits then m-1 0 bits. ` `public` `class` `GFG { ` ` ` ` ` `// Returns largest number with ` ` ` `// m set bits then m-1 0 bits. ` ` ` `static` `long` `answer(` `long` `n) ` ` ` `{ ` ` ` ` ` `// Start with 2 bits. ` ` ` `long` `m = ` `2` `; ` ` ` ` ` `// initial answer is 1 which ` ` ` `// meets the given condition ` ` ` `long` `ans = ` `1` `; ` ` ` `long` `r = ` `1` `; ` ` ` ` ` `// check for all numbers ` ` ` `while` `(r < n) { ` ` ` ` ` `// compute the number ` ` ` `r = ((` `long` `)Math.pow(` `2` `, m) - ` `1` `) * ` ` ` `((` `long` `)Math.pow(` `2` `, m - ` `1` `)); ` ` ` ` ` `// if less then N ` ` ` `if` `(r < n) ` ` ` `ans = r; ` ` ` ` ` `// increment m to get ` ` ` `// the next number ` ` ` `m++; ` ` ` `} ` ` ` ` ` `return` `ans; ` ` ` `} ` ` ` ` ` `// Driver code ` ` ` `public` `static` `void` `main(String args[]) { ` ` ` ` ` `long` `n = ` `7` `; ` ` ` `System.out.println(answer(n)); ` ` ` `} ` `} ` ` ` `// This code is contributed by Sam007 ` |

## Python3

`# Python3 program to find ` `# largest number smaller ` `# than equal to n with m ` `# set bits then m-1 0 bits. ` `import` `math ` ` ` `# Returns largest number ` `# with m set bits then ` `# m-1 0 bits. ` `def` `answer(n): ` ` ` ` ` `# Start with 2 bits. ` ` ` `m ` `=` `2` `; ` ` ` ` ` `# initial answer is ` ` ` `# 1 which meets the ` ` ` `# given condition ` ` ` `ans ` `=` `1` `; ` ` ` `r ` `=` `1` `; ` ` ` ` ` `# check for all numbers ` ` ` `while` `r < n: ` ` ` ` ` `# compute the number ` ` ` `r ` `=` `(` `int` `)((` `pow` `(` `2` `, m) ` `-` `1` `) ` `*` ` ` `(` `pow` `(` `2` `, m ` `-` `1` `))); ` ` ` ` ` `# if less then N ` ` ` `if` `r < n: ` ` ` `ans ` `=` `r; ` ` ` ` ` `# increment m to get ` ` ` `# the next number ` ` ` `m ` `=` `m ` `+` `1` `; ` ` ` `return` `ans; ` ` ` `# Driver Code ` `print` `(answer(` `7` `)); ` ` ` `# This code is contributed by mits. ` |

## C#

`// C# program to find largest number ` `// smaller than equal to n with m set ` `// bits then m-1 0 bits. ` `using` `System; ` ` ` `class` `GFG { ` ` ` `// Returns largest number with ` `// m set bits then m-1 0 bits. ` `static` `long` `answer(` `long` `n) ` `{ ` ` ` ` ` `// Start with 2 bits. ` ` ` `long` `m = 2; ` ` ` ` ` `// initial answer is 1 which ` ` ` `// meets the given condition ` ` ` `long` `ans = 1; ` ` ` `long` `r = 1; ` ` ` ` ` `// check for all numbers ` ` ` `while` `(r < n) { ` ` ` ` ` `// compute the number ` ` ` `r = ((` `long` `)Math.Pow(2, m) - 1) * ` ` ` `((` `long` `)Math.Pow(2, m - 1)); ` ` ` ` ` `// if less then N ` ` ` `if` `(r < n) ` ` ` `ans = r; ` ` ` ` ` `// increment m to get ` ` ` `// the next number ` ` ` `m++; ` ` ` `} ` ` ` ` ` `return` `ans; ` `} ` ` ` ` ` `// Driver Code ` ` ` `static` `public` `void` `Main () ` ` ` `{ ` ` ` `long` `n = 7; ` ` ` `Console.WriteLine(answer(n)); ` ` ` `} ` `} ` ` ` `// This code is contributed by vt_m. ` |

## PHP

`<?php ` `// PHP program to find largest number ` `// smaller than equal to n with m set ` `// bits then m-1 0 bits. ` ` ` `// Returns largest number with m set ` `// bits then m-1 0 bits. ` `function` `answer( ` `$n` `) ` `{ ` ` ` ` ` `// Start with 2 bits. ` ` ` `$m` `= 2; ` ` ` ` ` `// initial answer is 1 ` ` ` `// which meets the ` ` ` `// given condition ` ` ` `$ans` `= 1; ` ` ` `$r` `= 1; ` ` ` ` ` `// check for all numbers ` ` ` `while` `(` `$r` `< ` `$n` `) ` ` ` `{ ` ` ` ` ` `// compute the number ` ` ` `$r` `= (pow(2, ` `$m` `) - 1) * ` ` ` `(pow(2, ` `$m` `- 1)); ` ` ` ` ` `// if less then N ` ` ` `if` `(` `$r` `< ` `$n` `) ` ` ` `$ans` `= ` `$r` `; ` ` ` ` ` `// increment m to get ` ` ` `// the next number ` ` ` `$m` `++; ` ` ` `} ` ` ` ` ` `return` `$ans` `; ` `} ` ` ` ` ` `// Driver Code ` ` ` `$n` `= 7; ` ` ` `echo` `answer(` `$n` `); ` ` ` `// This code is contributed by Ajit. ` `?> ` |

**Output:**

6

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.