给出两个整数,L和R,其中L<=A<=B<=R,然后求出A^B值最大的数。其中1<=L<=R<=1000.
比如说L = 1;R = 3;
L 0001
R 0011
LR中间还有 0010,其中的最大值是0001 ^ 0010 = 0011;输出就是2.
写出一个函数计算这个数;
我写了一个,但是没通过最终测试,只有12分,总分20分,不知道哪里还需要改进?
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <stdlib.h> 5 #include <assert.h> 6 #define MAXSIZE (1000) 7 /* 8 求两个数的最大异或值。 9 */ 10 11 12 /* 13 * 14 */ 15 int maxXor(int l, int r) 16 { 17 //ASSERT 使用方法:放在函数开始,检测函数参数的合法性 18 assert(l >= 1); 19 assert(r <= MAXSIZE); 20 assert(l <= r); 21 22 //二进制位数 23 int lengthL = sizeof(l) * 8; 24 int lengthR = sizeof(r) * 8; 25 //最大值 26 int max = 0; 27 int len = (l+r)/2; 28 //标志位 29 int flag0 ,flag1; 30 //两个for循环遍历所有肯能的组合数 31 for (int i = l ; i <= len; i++) 32 { 33 //printf("i=%d",i); 34 35 for (int j = r ; j >= len; j--) 36 { 37 //printf("j=%d\n",j); 38 39 //初始化各种值 40 lengthL = sizeof(l) * 8; 41 lengthR = sizeof(r) * 8; 42 flag0 = 0; 43 flag1 = 0; 44 45 //从最高位开始判断 46 while (lengthL -- > 0 && lengthR -- >0) 47 { 48 if(i>>lengthL ^ j>>lengthR)//异或为1,记录 49 { 50 // printf("flag1=%d\n",flag1); 51 flag1 ++;// 52 } 53 else 54 { 55 //printf("flag0=%d\n",flag0); 56 flag0 ++; 57 if(flag1 != 0)//如果异或结果先出现1之后再次出现0,肯定不是最大值,退出while循环 58 { 59 printf("break\n"); 60 break;//退出while循环,取下一个数 61 } 62 } 63 //输出最大值,前提就是没有提前退出循环,那样才有可能是最大值 64 //比较所有符合要求的值,然后取最大值 65 if((flag0 + flag1) == sizeof(l) * 8) 66 { 67 if(max < (i ^ j)) 68 { 69 max = (i ^ j); 70 // printf("输出最大值=%d\n",max); 71 72 } 73 } 74 } 75 76 77 } 78 79 } 80 //printf("输出最大值:\n"); 81 82 return max; 83 } 84 85 86 87 88 int main() 89 { 90 int res; 91 int _l; 92 scanf("%d", &_l); 93 94 int _r; 95 scanf("%d", &_r); 96 97 res = maxXor(_l, _r); 98 printf("%d", res); 99 100 return 0; 101 }
时间: 2024-10-14 08:30:06