给定 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。
输入描述:
每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。 满足 0 < x , k ≤ 2,000,000,000。
输出描述:
输出一个数y。
输入例子:
5 1
输出例子:
2
分析:本题如果采用循环来解的话,如果想x,k的值比较大,势必造成算法复杂度过大,运行时间上通不过,经过仔细分析可以发现,所求y的二进制数应该是用k来依次填充x二进制数中的0,而x二进制数中的1则应该改为0。下面给出java代码:
import java.util.Scanner;
/**
* Created by Administrator on 2016/9/5.
*/
public class Main
{
public static void main(String[]args)
{
Scanner sc=new Scanner(System.in);
while (sc.hasNextInt())
{
int x=sc.nextInt();
int k=sc.nextInt();
StringBuilder sb=new StringBuilder();
String xB = Integer.toString(x, 2);
String kB = Integer.toString(k,2);
int lengthK=kB.length();
int index=lengthK-1;
int lengthX= xB.length();
for (int i = lengthX-1; i >=0 ; i--)
{
char c= xB.charAt(i);
if (index>=0)
{
if (c=='1') sb.append('0');
else
{
sb.append(kB.charAt(index--));
}
}
else break;
}
for (int i = index; i >=0 ; i--)
{
sb.append(kB.charAt(i));
}
sb.reverse();
System.out.println(Long.parseLong(sb.toString(),2));
}
sc.close();
}
}