二进制表示的最大数是m1和m-10

给定n,求出严格不超过n的最大数,其二进制表示由m个连续的1,然后是m-1个连续的零和其他任何东西组成 例如:

null
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 : 130Output : 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 120is the greatest of number<=120 which meets thegiven condition. 

A. 幼稚的方法 将从1遍历到N,检查由m个连续1和m-1个连续0组成的每个二进制表示,并存储满足给定条件的最大二进制表示。 一 有效的方法 就是观察数字的模式, [ 1(1), 6(110), 28(11100), 120(1111000), 496(111110000), ….] 为了得到满足条件的数的公式,我们以120为例- 120表示为1111000,其中m=4 1,m=3 0。将1111000转换为十进制,我们得到: 2^3+2^4+2^5+2^6可以表示为(2^m-1+2^m+2^m+1+…2^m+2,2^2*m) 2^3*(1+2+2^2+2^3),可以表示为(2^(m-1)*(1+2+2^2+2^3+…2^(m-1)) 2^3*(2^4-1)可以表示为 [2^(m-1)*(2^m-1)]。 所以所有满足给定条件的数字都可以表示为

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

我们可以迭代,直到数字不超过N,然后打印所有可能元素中的最大元素。仔细观察就会发现 m=33将超过10^18分 ,所以我们计算单位时间内的数字为 日志(32) 接近常数,这是计算 战俘 . 因此,总体复杂性将为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.
?>


Javascript

<script>
// Javascript 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.
let m = 2;
// initial answer is 1 which
// meets the given condition
let ans = 1;
let r = 1;
// check for all numbers
while (r < n) {
// compute the number
r = (Math.pow(2, m) - 1) *
(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
let n = 7;
document.write(answer(n));
</script>


输出:

6

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享