不引入第三个变量交换两个整型数
来源:互联网 发布:刘涛直播网络瘫痪 编辑:程序博客网 时间: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;
我个人目前的看法是对于两个整数,这种运算应该不会有问题,因为这个运算不会进位(不会溢出),也没有什么限制(不会报错)。计算机中数本来就是用二进制存的,所以不用转成二进制,直接就可以进行运算。这样一来,这个问题是不是就解决了呢?
陈述了一下自己愚见,不对地方还望大家斧正。
- 不引入第三个变量交换两个整型数
- 有没有意思,你说了算——不引入第三个变量交换两个整型数
- 交换两个数(不引入第三个变量)
- 交换两个数不引入第三个变量
- 不引入第三个变量交换两个数的值
- 不引入第三变量,交换两个数的值
- 交换两个数的值,且不引入第三个变量的实现
- 用按位异或运算符交换两个数,不引入第三个变量
- 两个整数交换(不引入第三个变量)
- 不引入第三个变量交换两个整数的值
- C++ - 两数交换, 不引入第三个变量
- 交互两个数(不引入第三个变量)
- 不使用第三个变量,交换两个数
- 不使用第三个变量,实现两个数交换
- 交换两个数的值(不使用第三个变量)
- 交换两个数的值,不引用第三个变量
- 不借助第三个变量实现两个数的交换
- 不引进第三个变量,如何交换两个整型变量的值
- UVALive 4031 Integer Transmission
- Linux中软件包格式:RPM、tar.gz、DEB区别
- C++ union结构
- MFC给按钮添加图片
- (1.1.7)UVA 10935 Throwing cards away I(直叙式模拟)
- 不引入第三个变量交换两个整型数
- BOOST库在Windows下的配置 [转]
- 离别大学生涯之际
- Android高效编程注意事项
- C++ const关键字用法详解 【转】
- OCP-1Z0-053-V12.02-190题
- 设计模式之设计模式原则
- Linux——列出文件详细信息
- android4.3.2下载编译运行生成win版adb、fastboot