C++程序 找出恰好有两个位设置的第N个自然数
给出一个整数 N ,任务是找到具有恰好两个位设置的第N个自然数。
举例:
输入: N = 4
输出: 9
解释:
恰好有两个位设置的数字: 3,5,6,9,10,12, ……
在这个数字中的第四个数字是9。
输入: N = 15
输出: 48
Naive Approach:
- 将循环运行在所有自然数上,并针对每个数字检查其是否具有两个位设置,这可以通过计算数字中的设置位来实现。
- 打印具有两个设置位的Nth数字。
Efficient Approach:
- 通过找到N所属的分区(分区“i”有“i”个数字)来找到最左边的设置位。
- 为了找到另一个设置位,我们需要首先找到N与前一分区的最后一个数字的距离。根据它们的差异,设置相应的位。
- 注意: 要在数字中设置第i位(i=0,1,2…):
k = k | (1<<(i))
- 下面是上述方法的实现:
// 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>
- 输出:
36
时间复杂度: 数字的分区
辅助空间: O(1),因为它使用常数变量