第乙個程式設計題是:用 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 方法二 利用 算術運算實現。優點 不需要額外的臨時變數...