不引入第三个变量交换两个整型数

来源:互联网 发布:刘涛直播网络瘫痪 编辑:程序博客网 时间:2024/06/05 16:23
今天又遇到了我刚接触编程就遇到的一个问题:交换两个整型数,分别在引入第三个变量和不引入第三个变量的情况下完成。

        引入第三个变量,其实是经典的交换算法,说它经典,是因为它适合任何情况,这里不对此方法进行论述。

        这个是我大一时候做的一道课后题,当时不明白,就找了一下度娘,然后硬着头皮看懂了,然后就交了作业。

        直到昨天再次碰到这个问题,才发现这个问题其实可以想的还有很多。

        首先,说一下我大一时从网上搜到的答案: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;

        我个人目前的看法是对于两个整数,这种运算应该不会有问题,因为这个运算不会进位(不会溢出),也没有什么限制(不会报错)。计算机中数本来就是用二进制存的,所以不用转成二进制,直接就可以进行运算。这样一来,这个问题是不是就解决了呢?

        陈述了一下自己愚见,不对地方还望大家斧正。