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\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

C语言编程题002的相关文章

一道有意思的C语言编程题

最近在看经典的C语言入门书籍K&R,虽然是一本入门书籍,可是其中的精妙之处却需要慢慢体会.其中的经典题很多,仔细琢磨一定会收获良多. 今天看到这样一道题:编写一个删除C语言程序中所有的注释语句.感觉颇有意思,与大家一起分享一下: 我的思路: 找到注释的起始符号 \ 判断紧接着的输入字符,如果是*或者是\,则说明后面全是注释,跳过即可,否则照样输出 其他则直接输出 疑问: 所配套的答案书中提出要考虑引号后面的内容以做出响应,不是很明白这是为什么.个人认为无需考虑引号的影响也能将注释去除,希望有高手

2018.3 江苏省计算机等级考试 C语言 编程题答案

题目要求:给定一个数字范围,输出满足这些条件: 1.能被3整除: 2.包含数字5, 将满足的数字放在特定的数组里输出.输出这些数里5出现的个数.数字的个数. 想起来有点伤心,本来很简单的题,考试的时候程序写错一行,结果成了死循环,最后还没找出来错,下来以后才想起来.以后必须长点心. 代码: #include<stdio.h>int flag(int x0,int x1,int b[],int *p);int main(){int i,intnumber,fivenumber;//数字的个数.5

C语言编程题001

有一颗树,一年两个生长周期,春天它长高一倍,夏天长高1m,问N个周期后树有多高?假设从春天开始树高为1m,第0个周期树高为1m. 要求:1.可以同时输入多个生长周期 如:3//表示下面有几个生长周期 0 1 4 输出结果为:1 2 7 不知道写的对不对,大家看一下啊 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <stdlib.h> 5 6 int main

C语言编程题

1.递归 汉诺塔是由三根杆子A,B,C组成的.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘:大盘不能叠在小盘上面.提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则.问:如何移? void MoveHanoi(int iCnt, char* pSrc, char* pMid, char* pDest) { if (iCnt == 1) { printf(" %s->%s\n&qu

程序设计入门—Java语言 第六周编程题 1 单词长度(4分)

第六周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 1 单词长度(4分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's"算一个单词,长度为4.注意,行中可能出现连续的空格. 输入格式: 输入在一行中给出一行文本,以'.'结束,结尾的句号不能计算在最后一个单词的长度内. 输出格式: 在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后

中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 细胞自动机(30分) 题目内容: 这是细胞自动机的非图形版本.细胞自动机是指在一个二维网格内,每一个网格是一个细胞.每个细胞有活和死两种状态. 初始时刻,有些细胞是活的,有些细胞是死的.自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活.具体的规则如下:

中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零

期末考试的编程题 返回 这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 二进制的前导的零(10分) 题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第一个1之前,有27

C语言程序设计进阶 第1周编程题

第1周编程题 查看帮助 返回 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 字符串比对(10分) 题目内容: 题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的.你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到

JavaScript编程题(含腾讯2016校招题)

作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几道觉得挺有意思的编程题,感觉做下来,自己对一些新方法的看法有了新的变化. 比如indexOf,reduce,Array.isArray,forEach这些方法,以前一看到兼容性是IE9+就有点害怕,项目中不敢用,导致后面越来越陌生,不过现在一想的话.其实只要用Polyfill或者提前fix掉就可以了