兩個數交換,不使用第三個空間

2022-03-05 12:59:47 字數 1354 閱讀 4756

昨天在乙個技術群中,一大堆人討論「兩個數交換,不使用第三個空間」這個問題。當時我給了個答案。

a = a + b;

b = a - b;

a = a - b;

不過後來發現有資料溢位的問題,比如函式void changeab(int a, int b);如果a = int.maxvalue - 10, 30;(int.maxvalue = 2147483647)那麼就會出現資料溢位的問題。雖然說最後兩個數字是互換了,但是總覺得不好,後來我又給了個答案:

a = a ^ b;

b = a ^ b;

a = a ^ b;

結果一些群友沒明白啥意思,當時我建議大家補習一下異或的知識。今天抽空,在這裡給大家補充一下第二種方法的解釋。在解釋之前需要學習一下「^」是什麼。「^」是異或的意思。如果學習過離散相信沒人不知道「異或」吧。我們的計算機是2進製,就是「0」和「1」,那麼01之間的異或關係就是下列樣子:

0 ^ 0 = 0;

0 ^ 1 = 1;

1 ^ 0 = 1;

1 ^ 1 = 0;

知道了異或關係,

a = a ^ b;

b = a ^ b;

a = a ^ b;

就十分好解釋了。 我已10和15為例。比如呼叫void changeab(int a, int b);的語句為:this.changeab(10, 15);其處理步驟為:

1、將10和15轉化成二進位制

00000000000000000000000000001111(第32的0代表是正數)

2、下面我開始翻譯

「a = a ^ b;"為:

a = 00000000000000000000000000001010 ^ 00000000000000000000000000001111 = 00000000000000000000000000000101

"b = a ^ b;"為:

b = 為:00000000000000000000000000000101 ^ 00000000000000000000000000001111 = 00000000000000000000000000001010

"a = a ^ b;"為:

a = 為:00000000000000000000000000000101 ^ 00000000000000000000000000001010 = 00000000000000000000000000001111

所以輸出時:

a = 00000000000000000000000000001111 = 15,

b = 00000000000000000000000000001010 = 10。

此式子的優勢是無需考慮正負問題,也無需考慮資料溢位問題。

兩個數互換,不使用第三個空間

昨天在乙個技術群中,一大堆人討論 兩個數交換,不使用第三個空間 這個問題。當時我給了個答案。a a b b a b a a b 不過後來發現有資料溢位的問題,比如函式void changeab int a,int b 如果a int.maxvalue 10,30 int.maxvalue 21474...

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

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

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

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