面试中常考的一类特殊的交换题目

1There are two int variables : a and b , don't use "if","? :","switch" or other judgement statements , find out the biggest one of the two numbers.

程序如下:

------------------------------------------------------------

#include <stdio.h>                                

int main()

{

    int a , b ,c;

    unsigned d;

    char *strs[2] = {"a的值较大","b的值较大"};

    printf("请输入两个数:/n");

    while(scanf("%d%d",&a,&b) != 2);

    c = a - b;

    d = (unsigned)(c) ;

    d = d >>(sizeof(int)*8 - 1);       

    printf("%s",*(strs+d));

    return 0;

}

------------------------------------------------------------

     理解上面这个程序的数据比较方法的关键是数据在内存中的存储方式:所有的数据在计算机中都是以二进制形式存储的,正数最高位用0表示,负数最高位为1。因此我们可以判断(a -b)的最高位是0还是1。由于(a-b)结果是正还是负是未知的!我们需要将这个结果转换为无符号数,然后通过移位直到将原来的最高位移到最低位就可以找到这个最高位了。由于不能使用判断语句,我们也不能在这时与10比较。这个时候我们也使用了一个技巧,将结果输出来!直接输出移位后的结果,这样显然不太文雅,看看我们的程序是如何做的吧!        前面讲了通过移位来获取最高位,那么应该移几位呢?这个我们需要判断(a-b)有几位!sizeof(int)*8,首先判断有几个字节,然后计算位数! 

      这个地方使用sizeof(unsigned)*8 结果也是一样的!我们可以通过在上面程序的最后加上下面的两句 

printf("The size of unsigned is %d/n",sizeof(unsigned));

printf("The size of int is %d/n",sizeof(int));

可以看到这两句的数据结果是一样的,在32位机器上的vc中都是4

  其实,求解该题还有另一种方法,即:(a+b+abs(a-b))/2

2、如何将ab的值进行交换,并且不使用任何中间变量?

方法一、

a=a+b;

b=a-b;

a=a-b;

这种方法有一个问题,就是当ab数值较大时容易产生越界溢出现象。那么有没有一种方法可以避免此方法的缺陷呢?有,采用如下所示的异或运算!

方法二、

a=a^b;

b=a^b;

a=a^b;

 

参考文献

[1]http://www.yuanma.org/data/2009/0922/article_3932.htm

[2]程序员面试宝典

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值