题目简介
给定整数 a 和 b,输出区间 [a,b] 中对应二进制表示含 1 的个数最多的整数。
如果存在多个解,则输出符合条件的最小的整数。
0≤a≤b≤2^63−1
说明
数据量很大,注意开unsigned long long。
思路就是在a的基础上不断把低位0变为1(利用巧妙的位运算实现),但不能超出b。这样同时保证了1的个数最多且数值最小。
#include <stdio.h>
typedef unsigned long long ll;
int main(void)
{
int t, i;
ll a, b, ans;
scanf("%d", &t);
for (i = 1; i <= t; ++i){
scanf("%llu%llu", &a, &b);
ans = a;
while ((ans | (ans + 1)) <= b)
ans |= ans + 1; //最低位的0设为1
printf("Case %d: %llu\n", i, ans);
}
return 0;
}