不用第三個變數進行交換兩數

2021-07-14 04:58:39 字數 1502 閱讀 4788

#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 continue

考慮另外一種儲存方式,用乙個變數儲存兩個資訊的集合,用另外乙個變數儲存任意乙個資訊,這種儲存方式就可以完成交換的工作。

上面這段話很抽象,我們用為**來表示

// 現在有兩個變數a, b,我使得

a = [a,b] // a 等於ab兩個資訊的集合

b = b // b 還是 b

這種表示方法,我們儲存了兩個資訊,但儲存方式不一樣,我們需要對資訊進行提取,例如我們要a時,則

c = a 去除 b

如果還是不明白這種儲存方式,那麼我直接給出就地交換的演算法:

void switch(int* p1, int* p2)

上面的**看起來有點煩? 把指標去掉看吧:

int a = 1;

int b = 2;

a = a + b;

b = a - b;

a = a - b;

這個思路很巧妙,但也存在一定問題: 萬一溢位了怎麼辦?

到目前為止,我們的答題思路是沒錯的,就是尋找另外一種資料儲存的模式,用乙個變數儲存兩條資訊的集合,我們仍然需要採用這種模式解決這個問題,但原先的簡單相加的模式是不行了,於是我們想到,集合兩個整型數字,是否可以從其二進位制表達方面來考慮?

我們可以使用位異或來儲存集合資訊。 用 1 和 0 來做簡單的驗證,看是否可以用異或的方式,儲存資訊的集合:

如果兩個數是a = 1和b = 0,則:

集合 = 1

0 異或 集合 = 1

1 異或 集合 = 0

如果 a = 1 & b = 1

集合 = 0

1 異或 集合 = 1

如果 a = 0 & b = 0

集合 = 0

0 疑惑 集合 = 0

驗證結果: 可以採用資訊集合的方式儲存

那麼我們的交換**可以變成:

int a = 10;

int b = 50;

a = a ^ b; // 構建集合

b = a ^ b; // 取出集合的另乙個元素

a = a ^ b; // 取出集合的另乙個元素

這種方式不用擔心資料溢位,應該算是就地交換兩個數的最佳解決方案了。

兩個數字交換不用第三個變數

交換函式 注意 雖然不用第三方變數的寫法感覺很牛,但是在複雜的程式環境中容易出現bug 下面會舉例bug 並且技巧性越強的 bug越不好找 因此只需掌握不用第三個變數的思路,平時最好用第三個變數來交換兩個數字 1.常用,最好理解 用第三方變數協助交換 相當於一瓶可樂,一瓶雪碧交換,用乙個空瓶子實現 ...

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

記得曾經看過不用引進第三個變數而直接變換兩個變數的值的例子。見過的兩種方法如下 方法一 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 方法二 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 這兩...

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

方法一 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 方法二 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 這兩種方法表面看起來只是一種技巧,有點小伎倆了,不過在嵌入式的開發上,卻有著極大的作...