J - 最大的位或

B君和G君聊天的时候想到了如下的问题。 
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。 
其中|表示按位或,即C、 C++、 Java中的|运算。

Input包含至多10001组测试数据。 
第一行有一个正整数,表示数据的组数。 
接下来每一行表示一组数据,包含两个整数l,r。 
保证 0 <= l <= r <= 10181018。Output对于每组数据输出一行,表示最大的位或。Sample Input

5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000

Sample Output

15
1
2047
 1 #include <iostream>
 2 using namespace std;
 3 #include<string.h>
 4 #include<set>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 #include<algorithm>
10 #include<cstdio>
11 #include<cmath>
12 #include<cstring>
13 #include <cstdio>
14 #include <cstdlib>
15 #include<cstring>
16 unsigned long long n,m;
17 int a[2000],b[2000];
18 int achang,bchang;
19 int meishaomvbianshen1( unsigned long long q)
20 {
21     int i;
22     for(i=0;q!=0;i++)
23     {
24         a[i]=q%2;
25         q/=2;
26     }
27     return i;
28 }
29 int meishaomvbianshen2( unsigned long long q)
30 {
31     int i;
32     for(i=0;q!=0;i++)
33     {
34         b[i]=q%2;
35         q/=2;
36     }
37     return i;
38 }
39 int main()
40 {
41     int i;
42     int t;
43     cin>>t;
44     while(t--)
45     {
46         cin>>n>>m;
47         memset(a,0,sizeof(a));
48         memset(b,0,sizeof(b));
49         achang=meishaomvbianshen1(n);
50         bchang=meishaomvbianshen2(m);
51         if(achang<bchang)
52         {
53             unsigned long long sum=0;
54              unsigned long long add=1;
55             for(i=0;i<bchang;i++)
56             {
57                 sum+=add;
58                 add*=2;
59             }
60             cout<<sum<<endl;
61             continue;
62         }
63         else if(achang==bchang)
64         {
65             if(n==m)
66             {
67                 cout<<n<<endl;
68                 continue;
69             }
70             int flag=0;
71             for(i=achang-1;i>=0;i--)
72             {
73                 if(flag)
74                     a[i]=1;
75                 else if(a[i]!=b[i])
76                 {
77                     a[i]=1;
78                     flag=1;
79                 }
80             }
81             unsigned long long sum=0;
82             unsigned long long add=1;
83             for(i=0;i<achang;i++)
84             {
85                 sum+=a[i]*add;
86                 add*=2;
87             }
88             cout<<sum<<endl;
89         }
90     }
91     return 0;
92 }
View Code

 

511
1000000000000000000
不多BB 代码简单易懂 还略显风骚
posted @ 2017-08-02 11:27  小小超plus  阅读(200)  评论(0编辑  收藏  举报