如何不使用第三個變數來交換兩個數的值

2022-07-23 23:48:18 字數 1487 閱讀 1613

最近在看《c++從入門到精通》自學c++,裡面有一道課後題是如何做到不適用第三個變數來交換兩個數的值,以下是我在網上查詢到的資料,記錄下並作為筆記。

題目:a=10,b=15,將a / b的值互換。

通常我們的做法是(尤其是在學習階段):定義乙個新的變數,借助它完成交換。**如下:

int a,b;

a=10; b=15;

int t;

t=a; a=b; b=t;

這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的交流,一般情況下碰到交換變數值的問題,都應採用此演算法(以下稱為標準演算法)。

上面的演算法最大的缺點就是需要借助乙個臨時變數。那麼不借助臨時變數可以實現交換嗎?答案是肯定的!

1) 算術運算

簡單來說,就是通過普通的+和-運算來實現。**如下:

int a,b;

a=10;b=12;

a=b-a; //a=2;b=12

b=b-a; //a=2;b=10

a=b+a; //a=10;b=10

通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後。

它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。

具體過程:第一句「a=b-a」求出ab兩點的距離,並且將其儲存在a中;第二句「b=b-a」求出a到原點的距離(b到原點的距離與ab兩點距離之差),並且將其儲存在b中;第三句「a=b+a」求出b到原點的距離(a到原點距離與ab兩點距離之和),並且將其儲存在a中。完成交換。

此演算法與標準演算法相比,多了三個計算的過程,但是沒有借助臨時變數。(以下稱為算術演算法)

該演算法還可以這樣做:

int a,b;

a=10;b=12;

a=a+b=22;

b=a-b=10;

a=a-b=12;

兩個減操作乙個加操作,執行的先後順序不一樣,其原理也稍微有些區別,但根本原理是一樣滴。

3) 位運算

通過異或運算也能實現變數的交換,這也許是最為神奇的,請看以下**:

int a=10,b=12; //a=1010^b=1100;

a=a^b; //a=0110^b=1100;

b=a^b; //a=0110^b=1010;

a=a^b; //a=1100=12;b=1010;

此演算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使資料中的某些位翻轉,其他位不變。這就意味著任意乙個數與任意乙個給定的值連續異或兩次,值不變。

即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理可以得到a=b^a^a=b;輕鬆完成交換。

以上三個演算法均實現了不借助其他變數來完成兩個變數值的交換,相比較而言算術演算法和位演算法計算量相當,位址演算法中計算較複雜,卻可以很輕鬆的實現大型別(比如自定義的類或結構)的交換,而前兩種只能進行整形資料的交換(理論上過載「^」運算子,也可以實現任意結構的交換)。

如何不使用第三個變數來交換兩個數的值

複試面試老師問了這個問題,當時真的不知道.1 算術運算 簡單來說,就是通過普通的 和 運算來實現。如下 int a,b a 10 b 12 a b a a 2 b 12 b b a a 2 b 10 a b a a 10 b 10 通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容...

交換兩個變數的值,不使用第三個變數

通常我們的做法是 尤其是在學習階段 定義乙個新的變數,借助它完成交換。如下 int a,b a 10 b 15 int t t a a b b t 這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的...

不使用第三個變數交換兩個數值。

上班時間,閒來無事,寫個小演算法消遣下。題目來自某.net面試題集錦。相信很多看官也耳熟能詳。也頗為簡單,不會者學,會者繞道。題目如下 不用第三個變數,交換兩個數值。心得 1.時刻注意現在的i,j是最原始的i,j的什麼組合。2.out 原來必須要初始化才能用地。class program j i,j...