码迷,mamicode.com
首页 > 编程语言 > 详细

C语言编程题002

时间:2015-04-12 23:57:52      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

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

 

 

 

C语言编程题002

标签:

原文地址:http://www.cnblogs.com/songliquan/p/4420947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!