给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。
暴力枚举法:我们从1遍历到最大的长整型数(long long),求出满足要求的第k小的数。时间复杂度过于庞大。代码如下:
int theNum(int x, int k)
{
int num = 0;
long long i = 1;
//从1遍历到最大的长整数数
for (; i < LLONG_MAX; ++i)
{
//如果num小于k,且x|i与x+i相等,那么num加一
if (num < k && ((x | i) == (x + i)))
{
num++;
}
//当num等于第k小的数时,终止循环
if (num == k)
{
break;
}
}
//返回第k小的数
return i;
}
给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。 暴力枚举法:我们从1遍历到最大的长整型数(long long),求出满足要求的第k小的数。时间复杂度过于庞大。代码如下:int theN