兩個整數交換

2021-07-30 07:45:21 字數 1032 閱讀 4359

第乙個程式設計題是:用 c 語言寫乙個函式交換兩整數的值,不借助第三個變數。

事實上這個題目一聽到就有了想法,因為以前有做過,形如:

(方法一:)

a = a + b;

b = a - b;

a = a - b;

不過提出了最大的問題,就是兩個正數的溢位問題。這個確實是缺限,以前遇到卻沒去找它的解決方法。

此時提出了強轉型別為long int再做計算的想法(這時因為在想前面的問題沒聽懂)

然後基於這個想法提出了直接強轉 double 運算完再轉回 int,不過方法不可行

因為總需要將中間結果寫到整型的a或b中,一樣存在溢位的事實。

但大臉又提出了他的解法:

(方法二:)

a = a - b;

b = a + b;

a = b - a;

這方法以前決對沒想過,原因在於方法一是從別的地方看到的,而非自己做出來的,沒有解題過程的思維

乍一看,不存在兩正數溢位的情況,不過在討論中發現還是存在溢位的情況:一正數與一負數。

然後換了題目討論而沒有繼續研究,直到過來問我他們的筆試題,我把知道的和他說了一下。

說到這題目時我把討論的情況說了一下,不過說的過程中我發現了之前忽略的問題:

用方法一的話,溢位的可能性存在於:

1.兩正數的交換

2.兩負數的交換

即同號

於是又想了方法二,發現溢位的可能性存在於:

1.一正一負的交換

即異號

就這樣綜合一下得到了答案:

void swap(int *a, int *b)

else

} 現在看來,其實這個並不難想到,只是發現自己解決問題時太依賴經驗思維

尤其是對於認為簡單的事情往往都沒有換個角度進行思考,錯失發現潛在事實的機會

這應該就是晚上的收穫了。。

補充:睡覺前搜到這個東西,看了又無語了一次,相同的思維方式的另乙個結果

void swap(int *a, int *b)

分析交換兩個整數的特殊寫法

由於異或與順序無關,則 4 可以寫成 b b b a 5 由異或的性質知道 b b 0,所以 5 進一步改寫成b 0 a,由性質0與任何數異或不改變其值,可知上式子等價於 b a,由以上分析可得 1 2 兩句話將a的值放入b中,即執行了 1 2 後b的值已經改變成a的值,剩下的問題就是如何將原來的b...

五種方法交換兩個整數

備註 int 範圍 2 31 2 31 1 即 2147483648 2147483647 long long 範圍 2 63 2 63 1 即 9223372036854775808 9223372036854775807 第一種方法 三變數法 特點 通用性強,簡潔易懂 includeusing ...

交換兩個變數

目的 實現兩個變數值的交換 以int 型別為例 方法一 使用臨時變數。優點 安全,適合任何型別資料交換,無溢位風險。缺點 保守 效率不高,需要使用第三方臨時變數 棧空間 1 void swap value int var1,int var2 2 方法二 利用 算術運算實現。優點 不需要額外的臨時變數...