B - And Or---(2015 NEUQ_ACM summer training #1)

题目链接:http://7xjob4.com1.z0.glb.clouddn.com/f595a508afa947b5f898ccbdb1e10002


在雨神兼男神的指导下AC了。

题目大意:输入两个数,然后计算中间所有数进行与运算和或运算的到的结果分别是多少?
思路:直接暴力计算肯定会超时. 把a b转换为二进制数,如果是不同位数的因为进位所以会导致&的结果为0,|的结果为2^k-1,k是b的二进制数的位数。同一个二进制位的情况下,从最高位往下比较,碰到某一位不同后,后面的&全部置0,|全部置1(也是进位的原因)。

 

CODE:

<span style="font-size:24px;">#include <iostream>
using namespace std;

typedef long long ll;
const int maxn=65;
int T,cnt=0;
ll A,B,OR=0,AND=0;
int A_bit[maxn],B_bit[maxn];

int bit(ll x,int *arr){
    int leng=0;
    while(x){
        arr[leng++]=x&1;
        x>>=1;
    }
    return leng;
}


void cal()
{
    ll tmp=1;
    int leng1=bit(A,A_bit),leng2=bit(B,B_bit);
    if(leng1!=leng2){
        OR=(tmp<<leng2);
        return ;
    }
    else if(leng1==leng2){
        while(leng2>0&&A_bit[leng2-1]==B_bit[leng2-1])
            leng2--;
        for(int i=leng2;i<leng1;i++)
            if(A_bit[i])
                AND+=(tmp<<i);
        OR=(tmp<<leng2)+AND;
    }
    return ;
}

int main()
{
    cin>>T;
    while(T--){
        cnt++;
        cin>>A>>B;
        AND=0;
        cal();
        cout<<"Case "<<cnt<<": "<<OR-1<<' '<<AND<<endl;
    }
    return 0;
}</span>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值