您的位置:首页 > 大数据 > 人工智能

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

2015-08-05 15:00 435 查看
题目链接: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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: