这是我写得一个,但不是最优答案,求最优答案啊
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #include <stdlib.h>
- #include <assert.h>
- #define MAXSIZE (1000)
- /*
- 求两个数的最大异或值。
- */
- /*
- *
- */
- int maxXor(int l, int r)
- {
- //ASSERT 使用方法:放在函数开始,检测函数参数的合法性
- assert(l >= 1);
- assert(r <= MAXSIZE);
- assert(l <= r);
-
- //二进制位数
- int lengthL = sizeof(l) * 8;
- int lengthR = sizeof(r) * 8;
- //最大值
- int max = 0;
- int len = (l+r)/2;
- //标志位
- int flag0 ,flag1;
- //两个for循环遍历所有肯能的组合数
- for (int i = l ; i <= len; i++)
- {
- //printf("i=%d",i);
- for (int j = r ; j >= len; j--)
- {
- //printf("j=%d\n",j);
-
- //初始化各种值
- lengthL = sizeof(l) * 8;
- lengthR = sizeof(r) * 8;
- flag0 = 0;
- flag1 = 0;
-
- //从最高位开始判断
- while (lengthL -- > 0 && lengthR -- >0)
- {
- if(i>>lengthL ^ j>>lengthR)//异或为1,记录
- {
- // printf("flag1=%d\n",flag1);
- flag1 ++;//
- }
- else
- {
- //printf("flag0=%d\n",flag0);
- flag0 ++;
- if(flag1 != 0)//如果异或结果先出现1之后再次出现0,肯定不是最大值,退出while循环
- {
- printf("break\n");
- break;//退出while循环,取下一个数
- }
- }
- //输出最大值,前提就是没有提前退出循环,那样才有可能是最大值
- //比较所有符合要求的值,然后取最大值
- if((flag0 + flag1) == sizeof(l) * 8)
- {
- if(max < (i ^ j))
- {
- max = (i ^ j);
- // printf("输出最大值=%d\n",max);
-
- }
- }
- }
-
-
- }
-
- }
- //printf("输出最大值:\n");
- return max;
- }
- int main()
- {
- int res;
- int _l;
- scanf("%d", &_l);
-
- int _r;
- scanf("%d", &_r);
-
- res = maxXor(_l, _r);
- printf("%d", res);
-
- return 0;
- }
复制代码 |