不使用中间变量交换两个数(Java版)
本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!
在程序中實現(xiàn)交換兩個數(shù)的功能并不復(fù)雜,但如果不使用中間變量,就需要動一下腦筋。在本文介紹了兩個方法(其實原理都是一個)。其基本原理就是數(shù)的中和。 也就是說,通過某種運算(二元運算)將a和b兩個數(shù)變成一個數(shù),并保存在其中一個變量中。然后再通過同樣的運算符將a或b中和掉。這樣實際上是利用了a或 b本身作為了中間變量。
先看第一個算法。
staticclassNum
{
inta;
intb;
}
publicstaticvoidswap1(Numnum)
{
num.a=num.a+num.b;
num.b=num.a-num.b;
num.a=num.a-num.b;
}
上面代碼通過“+”運算符將a和b的運算結(jié)果賦給了a(這時a是中間變量)。然后再計算b,這時a的值已經(jīng)是(a+b)了,因此,a再減b就是原來的a。 而這時b已經(jīng)是原來的a了,因此,再用運算后的a(實際上是a+b)減運算后的b(實際上是原來的a),就是原來的b了,最后將這個b賦值給a。
實際上,我們還可以使用“*”、“/”等符號來實現(xiàn)同樣的效果,代碼如下:
publicstaticvoidswap2(Numnum)
{
num.a=num.a*num.b;
num.b=num.a/num.b;
num.a=num.a/num.b;
}
publicstaticvoidswap3(Numnum)
{
num.a=num.a-num.b;
num.b=num.a+num.b;
num.a=num.b-num.a;
}
上面代碼在Java中沒有什么問題(但使用“/”時,分母和分子不能為0)。就算溢出也會得到正確的結(jié)果,但有某些語言中(如C語言),可能會拋出溢出錯誤,不了避免這種錯誤。可以加判斷,代碼如下:
publicstaticvoidswap4(Numnum)
{
//不同符號
if(num.a*num.b<=0)
{
num.a=num.a+num.b;
num.b=num.a-num.b;
num.a=num.a-num.b;
}
else
{
num.a=num.a-num.b;
num.b=num.a+num.b;
num.a=num.b-num.a;
}
} 當然,我們還有更好的方法,就是使用異或運算符,我們知道,任何數(shù)與0異或后仍然為它本身,兩個相同的數(shù)異或后為0。根本這種特性,可以有如下代碼。
publicstaticvoidswap5(Numnum)
{
num.a=num.a^num.b;
num.b=num.a^num.b;
num.a=num.a^num.b;
}
總結(jié)
以上是生活随笔為你收集整理的不使用中间变量交换两个数(Java版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 医院导航系统-智慧医院室内导航-院内导航
- 下一篇: LeetCode题库整理(自学整理)