Description
给定一个范围[a,b] (0<=a<b<=10^18) 求出该范围内二进制中1的个数最多的数,如果存在多个答案,输出最小的那个数
Input
输入数据有多组,每组数据输入两个整数a,b,表示区间[a, b]。
Output
输出该区间内二进制的1最多的整数,如果有多个数二进制1的个数相同,输出最小的那个数。
Sample Input
4 8
7 14
Sample Output
7
7
分析:找规律的一道题, 把两个数都化为二进制然后对齐(位数不足前面凑0),然后两个数从前往后上下匹配,从第一个不相同的地方开始,变为0后面的全部变为1.这个数就是所求的拿个数.
上代码:
#include <stdio.h>
long long a,b,c,d;
int main()
{
while(scanf("%lld%lld",&a,&b)!=EOF)
{
c=a^b;
d=1;
while(c)
{
c=c/2;
d=d*2;
}
d=d/2-1;
printf("%lld\n",d|a);
}
return 0;
}