【...】
是寒假做的题解,但是不知道什么时候设置成私密了,奇奇怪怪的
【题解】
这道题真的绊了我很久很久...但是通过量好高啊...于是
我们知道只有0|0才是0,把a,b化成二进制先按位或一遍,然后我们可以发现每2^(i-1)个数可以把第i位从0->1,如果a的二进制数的位数小于b,那么显然可以把b的第一位后边的每一位都或成1。
当然我们知道肯定有更简便合理的做法(哭了我真是太菜了),如下:
法一:两个不相同的数做或运算只会变大,a+1至少1位要进行改变,a|(a+1)每次起码多补1位0,直到当前数字超过b为止。
法二:如果a和b的二进制位数一样,那么直接从左往右找到第一个不相同的数字,然后把后面所有的数都变成1,这个就是答案(因为从a到b过程中,后面的所有位都会0到1到0的变化,所以后面的数都是1)。如果a和b的位数不相同,那么答案就是b的最高位为1并且后面都是1,即2^(b的位数)-1。(代码我就不写了因为好像也没有那么简便hhh)
【法一】
int main()
{
long long a,b;
while(cin>>a>>b)
{
while(a<b)
a=a|(a+1);
cout<<a<<endl;
}
}
【原代码】
#include<