作业专用iOS日常须知

交换两个变量的值

2016-03-27  本文已影响390人  youngyunxing

题目:

    int a = 10;
    int b = 11;
    要求交换a,b的值
    int temp = a;
    a = b;
    b = temp;
    点评:最常用的方法,最容易看懂的方法,也最不容易出错,程序中一般用这种方法
    a = a + b;
    b = a - b;
    a = a - b;
点评:利用加法 和 加法的逆运算(也就是减法)的原理
优点:相对于方法1,不需要定义temp因此节约内存;
缺点:缺点明显,首先别人不容易看懂你的代码.可读性很差.其次,上述方法成立的前提条件是不会发生内存溢出.例如这种情况下,此方法将失效
    int a = 3294967295;
    int b = 3444444444;
因为a + b 的值超出了int 的最大范围,导致内存溢出了,这种情况下运行结果是
      a = -850522852
      b = -1000000001
    a = a - b;
    b = a + b;
    a = b - a;
    点评:同方法二一样,不再解释
    a = a ^ b;
    b = a ^ b;
    a = b ^ a;
点评:推理过程
a ^ a = 0,也就是一个数异或自己等于0
0 ^ b = b,也就是0异或一个数还是这个数
a^b^b = a^(b^b) = a ^ 0 = a;
这种方法不存在内存溢出的情况,也节约内存,可读性还是不好

方法5

a = b + (b = a) *0;
点评:这种方法就比较奇葩了,利用了运算的优先级,也不存在内存溢出问题,同样节约内存,但是编译器会报警告,我用的Xcode编译器,不知道别的编译器会不会报错
   //2a + 2b = c;//这是算法原理
   
     a = a *2 + b *2;
     b = (a - b *2) *0.5;
     a = (a - b *2) *0.5;
     
     运算结果:
      a = 11
      b = 10
     结果也交换成功了
     为什么呢?
     主要就是根据2a + 2b = c这个算法是可逆的,然后将计算结果c赋值给其中一个变量,然后利用可逆运算把另一个变量也计算出来

全文完

上一篇下一篇

猜你喜欢

热点阅读