A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© slq0378 中级黑马   /  2015-4-14 21:53  /  703 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

给出两个整数,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.

写出一个函数计算这个数;


1 个回复

倒序浏览
这是我写得一个,但不是最优答案,求最优答案啊
  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. int maxXor(int l, int r)
  14. {
  15.     //ASSERT 使用方法:放在函数开始,检测函数参数的合法性
  16.     assert(l >= 1);
  17.     assert(r <= MAXSIZE);
  18.     assert(l <= r);
  19.    
  20.     //二进制位数
  21.     int lengthL = sizeof(l) * 8;
  22.     int lengthR = sizeof(r) * 8;
  23.     //最大值
  24.     int max = 0;
  25.     int len = (l+r)/2;
  26.     //标志位
  27.     int flag0 ,flag1;
  28.     //两个for循环遍历所有肯能的组合数
  29.     for (int i = l ; i <= len; i++)
  30.     {
  31.         //printf("i=%d",i);

  32.           for (int j = r ; j >= len; j--)
  33.           {
  34.                  //printf("j=%d\n",j);
  35.               
  36.                  //初始化各种值
  37.                  lengthL = sizeof(l) * 8;
  38.                  lengthR = sizeof(r) * 8;
  39.                  flag0 = 0;
  40.                  flag1 = 0;
  41.               
  42.                  //从最高位开始判断
  43.                  while (lengthL -- > 0 && lengthR -- >0)
  44.                  {
  45.                      if(i>>lengthL ^ j>>lengthR)//异或为1,记录
  46.                      {
  47.                         // printf("flag1=%d\n",flag1);
  48.                          flag1 ++;//
  49.                      }
  50.                      else
  51.                      {
  52.                          //printf("flag0=%d\n",flag0);
  53.                          flag0  ++;
  54.                          if(flag1 != 0)//如果异或结果先出现1之后再次出现0,肯定不是最大值,退出while循环
  55.                          {
  56.                              printf("break\n");
  57.                              break;//退出while循环,取下一个数
  58.                          }
  59.                      }
  60.                      //输出最大值,前提就是没有提前退出循环,那样才有可能是最大值
  61.                      //比较所有符合要求的值,然后取最大值
  62.                      if((flag0 + flag1) == sizeof(l) * 8)
  63.                      {
  64.                          if(max < (i ^ j))
  65.                          {
  66.                              max = (i ^ j);
  67.                             // printf("输出最大值=%d\n",max);
  68.                            
  69.                          }
  70.                      }
  71.                  }
  72.               
  73.               
  74.           }
  75.      
  76.     }
  77.     //printf("输出最大值:\n");

  78.     return max;
  79. }




  80. int main()
  81. {
  82.     int res;
  83.     int _l;
  84.     scanf("%d", &_l);
  85.    
  86.     int _r;
  87.     scanf("%d", &_r);
  88.    
  89.     res = maxXor(_l, _r);
  90.     printf("%d", res);
  91.    
  92.     return 0;
  93. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马