今天又遇到了我剛接觸程式設計就遇到的乙個問題:交換兩個整型數,分別在引入第三個變數和不引入第三個變數的情況下完成。
引入第三個變數,其實是經典的交換演算法,說它經典,是因為它適合任何情況,這裡不對此方法進行論述。
這個是我大一時候做的一道課後題,當時不明白,就找了一下度娘,然後硬著頭皮看懂了,然後就交了作業。
直到昨天再次碰到這個問題,才發現這個問題其實可以想的還有很多。
首先,說一下我大一時從網上搜到的答案: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;
我個人目前的看法是對於兩個整數,這種運算應該不會有問題,因為這個運算不會進製(不會溢位),也沒有什麼限制(不會報錯)。計算機中數本來就是用二進位制存的,所以不用轉成二進位制,直接就可以進行運算。這樣一來,這個問題是不是就解決了呢?
陳述了一下自己愚見,不對地方還望大家斧正。
不用第三個變數進行交換兩數
include include using namespace std int main d c d c d c d d c cout c c d da a b b a b a a b cout a a b ba 3 b 2 c 3 d 2 a 2 b 3 press any key to cont...
Java不使用第三個變數交換兩個變數的資料
變數 儲存資料的空間 資料 文字和符號的表示 資料的分類 數字 byte short int long float double 非數字 char boolean author siggy public class vardemo 第一種加減法,當a或b為int型別的最大值時會越界,產生bug 第二...
如何在不引入第三個變數的情況下互換兩個變數的值
例 x 4 y 5。如何在不引入第三個變數的情況下互換x與y的值?第一種方法是加法。x x y y x y x x y 這個方案的缺陷在於,當x或者y足夠大的時候,可能產生溢位。第二種方法,把加法變為減法,與方案一類似。x x y y x y x y x 當然,改換成乘法和除法也可以解決以上問題。但...