• C语言编程题002


     给出两个整数,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
    ",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
    ",flag1);
     51                          flag1 ++;//
     52                      }
     53                      else
     54                      {
     55                          //printf("flag0=%d
    ",flag0);
     56                          flag0  ++;
     57                          if(flag1 != 0)//如果异或结果先出现1之后再次出现0,肯定不是最大值,退出while循环
     58                          {
     59                              printf("break
    ");
     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
    ",max);
     71                             
     72                          }
     73                      }
     74                  }
     75               
     76               
     77           }
     78      
     79     }
     80     //printf("输出最大值:
    ");
     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 }
  • 相关阅读:
    9-1058. 选择题(20)
    8-素数打表
    7- 插入与归并
    6-爱丁顿数(题意理解)
    5-单身狗(时间和空间的相互选择)
    4-1068. 万绿丛中一点红
    3-1067. 试密码
    2-素数打比表
    21-矩形的嵌套
    maven设置打jar包并引入依赖包
  • 原文地址:https://www.cnblogs.com/songliquan/p/4420947.html
Copyright © 2020-2023  润新知