1. 程式人生 > >兩個整數交換

兩個整數交換

  本文轉載自網際網路,如有侵權,請聯絡我及時刪除。謝謝。

第一個程式設計題是:用 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){
if ((*a > 0 && *b > 0) || (*a < 0 && *b < 0)){ //同號
*a = *a - *b;
*b = *a + *b;
*a = *b - *a;
}
else { //異號
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
}

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

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

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

補充:睡覺前搜到這個東西,看了又無語了一次,相同的思維方式的另一個結果
void swap(int *a, int *b){
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
}

轉載地址:http://blog.csdn.net/zhangxinrun/article/details/6040874