牛客周赛 Round 56 异或故事


题目描述

输入描述:

 

输出描述: 


 

代码:

#include<bits/stdc++.h>

using namespace std;

int lowbit(int x)
{
    return x&-x;
}

void solve()
{
    int a;
    cin>>a;

    if(a==1)
    {
        cout<<"2 3"<<endl;
    }
    else if(a==1e9)
    {
        cout<<lowbit(a)<<" "<<a-lowbit(a)<<endl;
    }
    else
    {
        cout<<1<<" "<<(1^a)<<endl;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin>>t;

    while(t--)
    {
        solve();
    }

    return 0;
}

代码讲解:
 

首先,这道题考察位运算中的异或,何为异或,一句口诀,相同为0,不同为1,将数字化为二进制的表示形式,然后让其按位进行异或操作,关于异或我们需要知道,a^b^c=a^(b^c) 
a^0=a, a^a=0,因此这道题,我们就可以 令 b=1, c=1^a, 如果a为奇数,那么1^a= a-1 , 如果a为偶数则,1^a=a+1 为奇数,主要这道题要求b和c 在1到1e9的范围之间,因此,当a=1e9时,c=1e9+1,超过范围了,而a=1时,c=0,也不行,因此a=1 和 a=1e9都需要进行特判,当a=1 时,题目已经给出了2 和 3 了,当a=1e9时,我们使用lowbit来计算,因为,lowbit是找到a二进制表示当中最低位的1,n-lowbit(n) 只改变了最低位的1,只让第x位,由1变为0,lowbit(n) 是只有第x位为1,其它位全部为0,而0对异或没有影响,因此和(n-lowbit(n))进行异或就可以得到 n,只要n不是2的整数次幂即可
 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值