题目描述
有若干只单身狗排成一排,编号从 l 到 r。GBX 发现,一个单身狗的编号的二进制中 1 的数量越多,表示该单身狗越强(就是单身越久咯 -_-|||)。GBX 想找到一只最强的单身狗和他做朋友(强者惺惺相惜吧 >_<)。
输入
输入一个 T(T ≤ 1000)表示 T 组数据。
对于每组数据输入两个正整数 l,r(1 ≤ l ≤ r ≤ 10^18 ),表示单身狗的标号。
对于每组数据输入两个正整数 l,r(1 ≤ l ≤ r ≤ 10^18 ),表示单身狗的标号。
输出
对于每组数据输出一个数表示最强的单身狗的标号(如果有多个输出最小的那个),每组数据占一行。
样例输入
2
1 100
123 654
样例输出
63
511
记录 l 的01串, 然后从最小的开始把0改变成1, 直到可以大于b, 就输出。
代码:
# include <stdio.h>
# include <string.h>
int a[2001];
int qwe(long long x) // 将二进制数存到数组里
{
int n = 0;
while (x != 0)
{
a[n ++] = x%2;
x /= 2;
}
return n;
}
int main(void)
{
int t;
scanf("%d", &t);
while (t --)
{
long long x, y;
scanf("%lld %lld", &x, &y);
int d, d1;
memset(a, 0, sizeof(a));
d = qwe(y); // 先找到y的最长二进制长度
memset(a, 0, sizeof(a)); // 初始化数组
d1 = qwe(x); // 将小的二进制数覆盖数组
if (x == y)
{
printf("%lld\n", x);
continue;
}
long long c = 1;
int i;
for (i = 0; i < d; i ++)
{
if (i != 0) // 只有第一个不加, 其他的每次乘二即可
c *= 2;
if (a[i] == 0)
{
if (x+c >= y) // 如果将这个值改成1后 大于b的值, 此时应该就是最大值
{
break;
}
else
x += c; // 否则的话, 把这个值变为1, 然后继续判断
}
}
printf("%lld\n", x);
}
return 0;
}