1. 程式人生 > >程式實現兩個整型數值的交換

程式實現兩個整型數值的交換

題目:請寫出一個小程式,實現對兩個整型數值一個和b的交換

思路1:交換兩個數值,最一般的做法,是建立一個臨時變數臨時,這個變數我們需要的不是它具體的值起到什麼作用,而是要借用它所開闢出來的空間,進行被交換變數的暫時存放將一個的值存入臨時,再將b存入一箇中,然後再將溫度裡存的一個的值放入b中,即可實現一個與b的交換,如圖:

 1  #include<stdio.h>
 2  
 3  int main()
 4  {
 5  
 6      int a = 10, b = 20;
 7      int temp;
 8      printf("
交換前:a=%d,b=%d\n", a, b); 9 10 temp = a; 11 a = b; 12 b = temp; 13 14 printf("交換後:a=%d,b=%d\n", a, b); 15 16 return 0; 17 }
View Code

 

 

則其結果:

 

那麼像這樣的題目,有沒有值得優化的地方呢。當然是有的,比如,假設現在禁止使用這個中間變數溫度,難道就不能再進行交換了嗎。當然是可以的,這裡給出優化的思路2,比如可以使用數值計算的方法,如圖分析

 

程式碼實現:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a = 10, b = 20;
 5     printf("交換前:a=%d,b=%d\n", a, b);
 6     
 7     a = a + b;
 8     b = a - b;
 9     a = a - b;
10     printf("交換後:a=%d,b=%d\n", a, b);
11     
12     return 0;
13 }
View Code

 

這裡並不用擔心數字大小的問題,因為做減法運算的變數a實際上是對a,b求和之後的結果覆蓋了。變數值已經發生變化了。故而結果仍舊在預期:

 

 

但是這個做法有沒有問題呢?當然是有的,因為我們知道整型值的儲存是有取值範圍的,當我們的變數進行相加時,需要注意的是,如果數值很小,是沒有問題的。比如現在要交換的兩個值進行相加,結果他們的和超過了範圍,那麼會發生溢位,這時在使用加法運算就有問題了,並且如果是想要引申到浮點型資料的交換,就會發生精度損失,那麼就可以看出,思路2也是有缺陷的

優化思路3:運用位運算操作符異或^

異或的功能是兩個二進位制值相同結果為0,相異結果為1,這裡將a和b先分別轉化為二進位制數,讓a與b異或,再讓得出的結果分比對a和b進行異或操作。可以看出異或的結果就如同一串密碼,一次異或相當於加密,兩次異或相當於解密

程式碼實現:
 1 #include<stdio.h>
 2 
 3 
 4 int main()
 5 {
 6     int a = 10, b = 20;
 7     
 8     printf("交換前:a=%d,b=%d\n", a, b);
 9     
10     a ^= b;
11     b ^= a;
12     a ^= b;
13     
14     printf("交換後:a=%d,b=%d\n", a, b);
15     
16     return 0;
17 }
View Code

 

 

採用異或就可以避免資料過大造成的溢位了,原因是,異或其實也被稱為不進位加法,它既然結果不會發生進位,那麼只要參與交換的變數取值沒有溢位,進行異或操作就永遠不會發生溢位。

當然異或操作進行交換,也不是沒有侷限性的。

作為二進位制進行為操作運算,故而這個方法就只適用於整型值之間的交換了。