不引入第三個變數交換兩個整型數

2021-06-18 15:16:24 字數 1174 閱讀 9235

今天又遇到了我剛接觸程式設計就遇到的乙個問題:交換兩個整型數,分別在引入第三個變數和不引入第三個變數的情況下完成。

引入第三個變數,其實是經典的交換演算法,說它經典,是因為它適合任何情況,這裡不對此方法進行論述。

這個是我大一時候做的一道課後題,當時不明白,就找了一下度娘,然後硬著頭皮看懂了,然後就交了作業。

直到昨天再次碰到這個問題,才發現這個問題其實可以想的還有很多。

首先,說一下我大一時從網上搜到的答案: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 當然,改換成乘法和除法也可以解決以上問題。但...