G:区间或和(思维)

一道关于区间或运算的问题,博主分享了在解决这个问题时遇到的困扰以及两种解法:法一是通过不断与自身加1做或运算直到超过目标值;法二是根据二进制位数判断,快速得出答案。虽然博主认为还有更简便的方法,但提供的解法已经揭示了问题的本质。
摘要由CSDN通过智能技术生成

【...】

是寒假做的题解,但是不知道什么时候设置成私密了,奇奇怪怪的

【题解】

这道题真的绊了我很久很久...但是通过量好高啊...于是

我们知道只有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<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值