黑马程序员技术交流社区
标题:
c语言编程题,有问题,请看
[打印本页]
作者:
slq0378
时间:
2015-4-14 21:53
标题:
c语言编程题,有问题,请看
给出两个整数,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.
写出一个函数计算这个数;
作者:
slq0378
时间:
2015-4-14 21:54
这是我写得一个,但不是最优答案,求最优答案啊
#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;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2