📌  相关文章
📜  最小数量N,使得从1到N的所有数字的总置位位数至少为X

📅  最后修改于: 2021-04-24 21:22:51             🧑  作者: Mango

给定数字X,任务是找到最小数字N,以使从1到n的所有数字的总置位比特至少为X。

例子:

Input: x = 5 
Output: 4 
Set bits in 1-> 1
Set bits in 2-> 1
Set bits in 3-> 2 
Set bits in 4-> 1 
Hence first four numbers add upto 5 

Input: x = 20 
Output: 11 

方法:使用二进制搜索获得位数最少的最大位数,直到N至少为X。开始时,low为0,high则根据约束进行初始化。每次检查设置位的计数是否至少为X,将其高电平更改为中1,否则将其更改为中+1。每次我们做高=中-1时,请存储最少的答案。

下面是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
#define INF 99999
#define size 10
  
// Function to count sum of set bits
// of all numbers till N
int getSetBitsFromOneToN(int N)
{
    int two = 2, ans = 0;
    int n = N;
  
    while (n) {
        ans += (N / two) * (two >> 1);
  
        if ((N & (two - 1)) > (two >> 1) - 1)
            ans += (N & (two - 1)) - (two >> 1) + 1;
  
        two <<= 1;
        n >>= 1;
    }
    return ans;
}
  
// Function to find the minimum number
int findMinimum(int x)
{
    int low = 0, high = 100000;
  
    int ans = high;
  
    // Binary search for the lowest number
    while (low <= high) {
  
        // Find mid number
        int mid = (low + high) >> 1;
  
        // Check if it is atleast x
        if (getSetBitsFromOneToN(mid) >= x) {
            ans = min(ans, mid);
            high = mid - 1;
        }
        else
            low = mid + 1;
    }
  
    return ans;
}
  
// Driver Code
int main()
{
    int x = 20;
    cout << findMinimum(x);
  
return 0;
}


Java
// Java implementation of the above approach
import java.util.*;
  
class solution
{
static int INF = 99999;
static int size = 10;
  
// Function to count sum of set bits
// of all numbers till N
static int getSetBitsFromOneToN(int N)
{
    int two = 2, ans = 0;
    int n = N;
  
    while (n!=0) {
        ans += (N / two) * (two >> 1);
  
        if ((N & (two - 1)) > (two >> 1) - 1)
            ans += (N & (two - 1)) - (two >> 1) + 1;
  
        two <<= 1;
        n >>= 1;
    }
    return ans;
}
  
// Function to find the minimum number
static int findMinimum(int x)
{
    int low = 0, high = 100000;
  
    int ans = high;
  
    // Binary search for the lowest number
    while (low <= high) {
  
        // Find mid number
        int mid = (low + high) >> 1;
  
        // Check if it is atleast x
        if (getSetBitsFromOneToN(mid) >= x) {
            ans = Math.min(ans, mid);
            high = mid - 1;
        }
        else
            low = mid + 1;
    }
  
    return ans;
}
  
// Driver Code
public static void main(String args[])
{
    int x = 20;
    System.out.println(findMinimum(x));
  
}
  
}
  
//This code is contributed by 
// Shashank_Sharma


Python3
# Python3 implementation of the 
# above approach
INF = 99999
size = 10
  
# Function to count sum of set bits
# of all numbers till N
def getSetBitsFromOneToN(N):
  
    two, ans = 2, 0
    n = N
  
    while (n > 0):
        ans += (N // two) * (two >> 1)
  
        if ((N & (two - 1)) > (two >> 1) - 1):
            ans += (N & (two - 1)) - (two >> 1) + 1
  
        two <<= 1
        n >>= 1
    return ans
  
# Function to find the minimum number
def findMinimum(x):
  
    low = 0
    high = 100000
  
    ans = high
  
    # Binary search for the lowest number
    while (low <= high): 
  
        # Find mid number
        mid = (low + high) >> 1
  
        # Check if it is atleast x
        if (getSetBitsFromOneToN(mid) >= x):
  
            ans = min(ans, mid)
            high = mid - 1
        else:
            low = mid + 1
      
    return ans
  
# Driver Code
x = 20
print(findMinimum(x))
  
# This code is contributed by
# Mohit kumar 29


C#
// Csharp implementation of the above approach 
using System ;
  
class solution 
{ 
static int INF = 99999; 
static int size = 10; 
  
// Function to count sum of set bits 
// of all numbers till N 
static int getSetBitsFromOneToN(int N) 
{ 
    int two = 2, ans = 0; 
    int n = N; 
  
    while (n!=0) { 
        ans += (N / two) * (two >> 1); 
  
        if ((N & (two - 1)) > (two >> 1) - 1) 
            ans += (N & (two - 1)) - (two >> 1) + 1; 
  
        two <<= 1; 
        n >>= 1; 
    } 
    return ans; 
} 
  
// Function to find the minimum number 
static int findMinimum(int x) 
{ 
    int low = 0, high = 100000; 
  
    int ans = high; 
  
    // Binary search for the lowest number 
    while (low <= high) { 
  
        // Find mid number 
        int mid = (low + high) >> 1; 
  
        // Check if it is atleast x 
        if (getSetBitsFromOneToN(mid) >= x) { 
            ans = Math.Min(ans, mid); 
            high = mid - 1; 
        } 
        else
            low = mid + 1; 
    } 
  
    return ans; 
} 
  
    // Driver Code 
    public static void Main() 
    { 
        int x = 20; 
        Console.WriteLine(findMinimum(x)); 
      
    } 
    // This code is contributed by Ryuga
}


PHP
> 1);
  
        if (($N & ($two - 1)) > ($two >> 1) - 1)
            $ans += ($N & ($two - 1)) - 
                          ($two >> 1) + 1;
  
        $two <<= 1;
        $n >>= 1;
    }
    return $ans;
}
  
// Function to find the minimum number
function findMinimum($x)
{
    $low = 0;
    $high = 100000;
  
    $ans = $high;
  
    // Binary search for the lowest number
    while ($low <= $high) 
    {
  
        // Find mid number
        $mid = ($low + $high) >> 1;
  
        // Check if it is atleast x
        if (getSetBitsFromOneToN($mid) >= $x) 
        {
            $ans = min($ans, $mid);
            $high = $mid - 1;
        }
        else
            $low = $mid + 1;
    }
  
    return $ans;
}
  
// Driver Code
$x = 20;
echo findMinimum($x);
  
// This code is contributed 
// by Sach_Code
?>


输出:
11

时间复杂度: O(log N * log N)