打印

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

[复制链接]
3498|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 | 只看该作者

路过

使用特权

评论回复
5
镶蓝| | 2008-4-11 12:41 | 只看该作者

第一题

a = a+b;
b = a-b;
a = a-b;

使用特权

评论回复
6
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;
剩下的由楼主自己去补充了。
以上皆为个人思想,欢迎大家劈砖。。。*^=^*

使用特权

评论回复
7
gyt| | 2008-4-11 17:26 | 只看该作者

好玩

使用特权

评论回复
8
mohanwei| | 2008-4-11 19:51 | 只看该作者

脑袋进水了

使用特权

评论回复
9
平常人| | 2008-4-12 08:57 | 只看该作者

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

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

注意:这里有很多括号,一个也不能少!

使用特权

评论回复
10
HWM| | 2008-4-12 10:13 | 只看该作者

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

使用特权

评论回复
11
johnwjl| | 2008-4-12 13:01 | 只看该作者

交换两数,用异或更好.

使用特权

评论回复
12
myfaith| | 2008-4-12 13:26 | 只看该作者

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

使用特权

评论回复
13
zxq1234508| | 2008-4-12 13:29 | 只看该作者

扩展了思路

使用特权

评论回复
14
HWM| | 2008-4-12 13:35 | 只看该作者

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

使用特权

评论回复
15
平常人| | 2008-4-12 14:01 | 只看该作者

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

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

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

上次要了一条21IC史上最短的裤头,这次再申请一个,哈哈哈。。。。。。。

使用特权

评论回复
16
mohanwei| | 2008-4-12 14:35 | 只看该作者

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

使用特权

评论回复
17
gyt| | 2008-4-12 14:37 | 只看该作者

15楼相当厉害:)

使用特权

评论回复
18
meng730507| | 2008-4-12 14:45 | 只看该作者

要学的精深没错

但忘了为什么学就是出题人的错了。

使用特权

评论回复
19
常来21ic| | 2008-4-12 16:10 | 只看该作者

思考第一题

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

出这题的人不是业余水平就是高人!

使用特权

评论回复
20
daipan| | 2008-4-12 16:54 | 只看该作者

我也碰到过~~~

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

22

帖子

0

粉丝