今天又遇到了我刚接触编程就遇到的一个问题:交换两个整型数,分别在引入第三个变量和不引入第三个变量的情况下完成。
引入第三个变量,其实是经典的交换算法,说它经典,是因为它适合任何情况,这里不对此方法进行论述。
这个是我大一时候做的一道课后题,当时不明白,就找了一下度娘,然后硬着头皮看懂了,然后就交了作业。
直到昨天再次碰到这个问题,才发现这个问题其实可以想的还有很多。
首先,说一下我大一时从网上搜到的答案:a=a+b; b=a-b; a=a-b;
在讨论的时候,又有人说了一个答案:a=a-b; b=a+b; a=b-a;
然后就开始将两种种答案进行对比,有人说第二种好,因为第一种会溢出、也有人说第二种必须要求a>b。
其实我想说的是,都不是,两种方式都会溢出,第二种没有必要a必须大于b。
你稍微总结一下你就会发现,只要满足b对a进行一对互逆的运算,那么这个在某种程度上就可以实现。
现在只从数学的角度上来考虑:
用乘除来得出解:
1) a=a*b; b=a/b; a=a/b;(a、b均不能为0)
2) a=a/b; b=a*b; a=b/a;(a、b均不能为0)
但是,这两种方式如果放到我们的题干中来看,限制太多了:
1)方法中,a*b太容易溢出;2)方法中,a必须能够整除b才行,因为两个整型数相除,结果会取整。
现在再深入总结一下,这个是不是就是用b对a进行了一下加密,然后再用b解密得出a,然后再用a密文进行一下解解密得出b的一个过程呢?
到这,不知道你是否还记得陈老爷子视频中的那个加密解密的程序?
上面的四种方式,哪个都有一定的缺陷,前三种是因为进位引起的,第四种是因为整型数的特点造成的。其实还有一种运算是可逆的——异或。
关于异或的一个特性就是:一个数连续异或另一个数两次,那么得到的还是本身。加密解密的程序就是用这个原理做的。
那么现在的你是不是也有了思路了呢?
我现在用VB中的符号来写一下:
a=a Xor b; b=a Xor b; a= a Xor b;
我个人目前的看法是对于两个整数,这种运算应该不会有问题,因为这个运算不会进位(不会溢出),也没有什么限制(不会报错)。计算机中数本来就是用二进制存的,所以不用转成二进制,直接就可以进行运算。这样一来,这个问题是不是就解决了呢?
陈述了一下自己愚见,不对地方还望大家斧正。