在程序中实现交换两个数的功能并不复杂但如果不使用中间变量就需要动一下脑筋在本文介绍了两个方法(其实原理都是一个)其基本原理就是数的中和也就是说通过某种运算(二元运算)将a和b两个数变成一个数并保存在其中一个变量中然后再通过同样的运算符将a或b中和掉这样实际上是利用了a或b本身作为了中间变量 先看第一个算法 static class Num { int a; int b; } public static void swap(Num num) { numa = numa + numb; numb = numa numb; numa = numa numb; } 上面代码通过+运算符将a和b的运算结果赋给了a(这时a是中间变量)然后再计算b这时a的值已经是(a+b)了因此a再减b就是原来的a 而这时b已经是原来的a了因此再用运算后的a(实际上是a+b)减运算后的b(实际上是原来的a)就是原来的b了最后将这个b赋值给a 实际上我们还可以使用*/等符号来实现同样的效果代码如下 public static void swap(Num num) { numa = numa * numb; numb = numa / numb; numa = numa / numb; } public static void swap(Num num) { numa = numa numb; numb = numa + numb; numa = numb numa; } 上面代码在Java中没有什么问题(但使用/时分母和分子不能为)就算溢出也会得到正确的结果但有某些语言中(如C语言)可能会抛出溢出错误不了避免这种错误可以加判断代码如下 public static void swap(Num num) { // 不同符号 if (numa * numb <= ) { numa = numa + numb; numb = numa numb; numa = numa numb; } else { numa = numa numb; numb = numa + numb; numa = numb numa; } } 当然我们还有更好的方法就是使用异或运算符我们知道任何数与异或后仍然为它本身两个相同的数异或后为根本这种特性可以有如下代码 public static void swap(Num num) { numa = numa ^ numb; numb = numa ^ numb; numa = numa ^ numb; } |