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

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

進行 element bsp 問題 info printf lin UNC sof

題目:請寫出一個小程序,實現對兩個整型數值一個和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

技術分享圖片技術分享圖片

技術分享圖片?

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

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

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

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