C++程序 找出恰好有两个位设置的第N个自然数

C++程序 找出恰好有两个位设置的第N个自然数

给出一个整数 N ,任务是找到具有恰好两个位设置的第N个自然数。
举例:

输入: N = 4

输出: 9

解释:

恰好有两个位设置的数字: 3,5,6,9,10,12, ……

在这个数字中的第四个数字是9。

输入: N = 15

输出: 48

Naive Approach:

  1. 将循环运行在所有自然数上,并针对每个数字检查其是否具有两个位设置,这可以通过计算数字中的设置位来实现。
  2. 打印具有两个设置位的Nth数字。

Efficient Approach:

  1. 通过找到N所属的分区(分区“i”有“i”个数字)来找到最左边的设置位。
  2. 为了找到另一个设置位,我们需要首先找到N与前一分区的最后一个数字的距离。根据它们的差异,设置相应的位。

C++程序 找出恰好有两个位设置的第N个自然数

  1. 注意: 要在数字中设置第i位(i=0,1,2…):
k = k | (1<<(i))
  1. 下面是上述方法的实现:
// C++ Code to  find the Nth number
// with exactly two bits set
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the Nth number
// with exactly two bits set
void findNthNum(long long int N)
{
 
    long long int bit_L = 1, last_num = 0;
 
    // Keep incrementing until
    // we reach the partition of 'N'
    // stored in bit_L
    while (bit_L * (bit_L + 1) / 2 < N) {
        last_num = last_num + bit_L;
        bit_L++;
    }
 
    // set the rightmost bit
    // based on bit_R
    int bit_R = N - last_num - 1;
 
    cout << (1 << bit_L) + (1 << bit_R)
         << endl;
}
 
// Driver code
int main()
{
    long long int N = 13;
 
    findNthNum(N);
 
    return 0;
}
// Java Code to  find the Nth number
// with exactly two bits set
class GFG{
  
// Function to find the Nth number
// with exactly two bits set
static void findNthNum(int N)
{
  
    int bit_L = 1, last_num = 0;
  
    // Keep incrementing until
    // we reach the partition of 'N'
    // stored in bit_L
    while (bit_L * (bit_L + 1) / 2 < N) {
        last_num = last_num + bit_L;
        bit_L++;
    }
  
    // set the rightmost bit
    //based on bit_R
    int bit_R = N - last_num - 1;
  
    System.out.print((1 << bit_L) + (1 << bit_R)
         +"\n");
}
  
// Driver code
public static void main(String[] args)
{
    int N = 13;
  
    findNthNum(N);
}
}
# Python代码查找恰好具有两个设置位的第N个数字
 
 
# 查找恰好具有两个设置位的第N个数字函数
def findNthNum(N):
 
    bit_L = 1;
    last_num = 0;
 
    # 保持增加直到我们到达'N'分区
    # 存储在bit_L中
    while (bit_L * (bit_L + 1) / 2 < N):
        last_num = last_num + bit_L;
        bit_L+=1;
     
 
    # 根据bit_R设置最右边的位
    bit_R = N - last_num - 1;
 
    print((1 << bit_L) + (1 << bit_R));
 
 
# 驱动程序代码
if __name__ == '__main__':
    N = 13;
 
    findNthNum(N);
 
//C#代码查找恰恰具有两个设置位的第N个数字
//通过System导入
using System;
 
class GFG{
   
// 查找恰好具有两个设置位的第N个数字函数
static void findNthNum(int N)
{
   
    int bit_L = 1, last_num = 0;
   
    // 保持增加直到我们到达'N'分区
    // 存储在bit_L中
    while (bit_L * (bit_L + 1) / 2 < N) {
        last_num = last_num + bit_L;
        bit_L++;
    }
   
    // 根据bit_R设置最右边的位
    int bit_R = N - last_num - 1;
   
    Console.Write((1 << bit_L) + (1 << bit_R)
         +"\n");
}
   
//驱动程序代码
public static void Main(String[] args)
{
    int N = 13;
   
    findNthNum(N);
}
}
<script>
 
//JavaScript代码查找恰好具有两个设置位的第N个数字
 
// 查找恰好具有两个设置位的第N个数字函数
function findNthNum(N)
{
 
    let bit_L = 1, last_num = 0;
 
    // 保持增加直到我们到达'N'分区
    // 存储在bit_L中
    while (bit_L * (bit_L + 1) / 2 < N) {
        last_num = last_num + bit_L;
        bit_L++;
    }
 
    // 根据bit_R设置最右边的位
    let bit_R = N - last_num - 1;
 
    document.write((1 << bit_L) + (1 << bit_R)
        + "<br>");
}
 
//驱动程序代码
let N = 13;
findNthNum(N);
</script>
  1. 输出:
36

时间复杂度: 数字的分区

辅助空间: O(1),因为它使用常数变量

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例