C语言2道笔试题,请大家解答

[复制链接]
4539|19
 楼主| superclee 发表于 2008-4-11 11:40 | 显示全部楼层 |阅读模式
昨天一个公司,出了两道笔试题,看来看去不懂,请各位高手解答。
  
1、int a,b;  交换两变量a,b值,但不能用中间变量。

2、int a,b;   比较两量a,b值大小,但不能用if语句,条件运算符,switch语句等其它一些比较语句。

望各位踊跃发言,让小弟见识见识。。。。。。
dai_weis 发表于 2008-4-11 11:47 | 显示全部楼层

第一无聊,第二变态,第三出题的脑子可能有问题

C是工具,实现某一功能,不是考回字的几种写法
这样的公司不去是幸运。
machunshui 发表于 2008-4-11 12:27 | 显示全部楼层

无聊的回答

a ^= b;   b ^= a;   a ^= b;

其实仔细想想也不无聊,思路分为三步:

1.a和b特征混合存入a
2.通过b本身抽取出a存入b
3.通过a(已经在b中)抽取出b,存入a


作为考题,肯定不合适。
单仔细推敲思路,很有意思.
sz_kd 发表于 2008-4-11 12:38 | 显示全部楼层
镶蓝 发表于 2008-4-11 12:41 | 显示全部楼层

第一题

a = a+b;
b = a-b;
a = a-b;
Alex500 发表于 2008-4-11 12:50 | 显示全部楼层

个人想法

1.此题可以通过以下方式实现: 
   int a,b;
   a=a-b;
   b=a+b;
   a=b-a;

2.此题如果要避免以上条件,我们可以尝试用下符号函数sign(n)来实现,如:sign(n)=0 a=b;
sign(n)=-1 a<b;
sign(n)=1 a>b;
剩下的由楼主自己去补充了。
以上皆为个人思想,欢迎大家劈砖。。。*^=^*
gyt 发表于 2008-4-11 17:26 | 显示全部楼层
mohanwei 发表于 2008-4-11 19:51 | 显示全部楼层

脑袋进水了

平常人 发表于 2008-4-12 08:57 | 显示全部楼层

#define max(a, b) ((a)>=(b))?(a):(b)

同理:#define min(a, b) ((a)<=(b))?(a):(b)

注意:这里有很多括号,一个也不能少!
HWM 发表于 2008-4-12 10:13 | 显示全部楼层

看了头晕。5,6楼更晕。莫非给“重载”了?不象啊。

johnwjl 发表于 2008-4-12 13:01 | 显示全部楼层

交换两数,用异或更好.

myfaith 发表于 2008-4-12 13:26 | 显示全部楼层

9楼不是用到比较了吗,不合题意

zxq1234508 发表于 2008-4-12 13:29 | 显示全部楼层

扩展了思路

HWM 发表于 2008-4-12 13:35 | 显示全部楼层

减一下,保留符号位(最高位)不就成了?

平常人 发表于 2008-4-12 14:01 | 显示全部楼层

哦,早上起来没吃饭就顺手写了一个,原来不符合题意。好

#define max(a,b) (((a)-(b))&(1<<(sizeof(int)*8-1))):(b)?(a)

注意看:没有用if,没有用条件运算符,也没有用switch语句,这里没有比较语句。

上次要了一条21IC史上最短的裤头,这次再申请一个,哈哈哈。。。。。。。
mohanwei 发表于 2008-4-12 14:35 | 显示全部楼层

说出题的人脑袋进水了没错……建议看看编译后的目标代码

gyt 发表于 2008-4-12 14:37 | 显示全部楼层

15楼相当厉害:)

meng730507 发表于 2008-4-12 14:45 | 显示全部楼层

要学的精深没错

但忘了为什么学就是出题人的错了。
常来21ic 发表于 2008-4-12 16:10 | 显示全部楼层

思考第一题

除非能保证不发生溢出,5楼的方法才满足这个考官的, 
假设执行 a=a+b;后发生溢出......后果不堪设想!

出这题的人不是业余水平就是高人!
daipan 发表于 2008-4-12 16:54 | 显示全部楼层

我也碰到过~~~

我也碰到过第一个面试题,“交换两变量a,b值,但不能用中间变量”

a=a+b要不要变成机器码?
机器码如何实现两数相加?
假设为add  ACC,a
cpu做加法的时候总得需要一个工作寄存器吧,
那么这个工作寄存器就是:“用中间变量”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部