题目链接: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>