c語言:多種方法實現兩個數的交換
阿新 • • 發佈:2019-01-23
交換兩個數的內容是c語言中常見的問題,所以在此總結一下我所學到的幾種方法。
首先,舉一個例子,假設a=10,b=20.
第一種方法,藉助一個臨時變數來進行儲存,這是最容易也是最直觀的方法。
程式碼如下:
int a, b, t;
a = 10;
b = 20;
printf("a=%d b=%d", a, b);
t = a;
a = b;
b = t;
printf("\n");
printf("a=%d b=%d", a, b);
實現結果如下:
在這種方法的基礎上,可以藉助指標寫一個函式來交換兩個數的大小。
程式碼如下:
void swap(int *pa, int *pb)
{
int tmp;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
void swap(int *pa, int *pb);
int a = 10;
int b = 20;
printf("a=%d b=%d\n", a, b);
swap(&a, &b);
printf("a=%d b=%d\n", a, b);
}
實現結果如下:
第二類方法,如果不允許藉助第三個變數,該如何做呢?
此時,可以有如下幾種辦法。
1)加減運算,這種方法實際上就是先將a+b的結果暫時先儲存在變數a中,通過改變後的a和原始的b進行減法就可以得到交換後的b,但是這種方法存在缺陷,a和b都是int型的話,可能會造成溢位。
程式碼如下:
int a = 10;
int b = 20;
printf("a=%d b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;//同號時可能溢位
printf("a=%d b=%d\n", a, b);
2)乘除運算,與加減類似,用a*b替代a+b放在a中暫存,但是這種方法與加減運算一樣有著缺陷,比加減運算更容易溢位。
int a = 10;
int b = 20;
printf("a=%d b=%d\n", a, b);
a = a*b;
b = a/b;
a = a/b;
printf ("a=%d b=%d\n", a, b);
3)位運算,這種方法比起加減和乘除來說,並不會有溢位的可能。主要利用了異或的特性,將a^b的值存在a裡,就可以順利完成交換。
int a = 10;
int b = 20;
printf("a=%d b=%d\n", a, b);
a = a^b;
b = a^b;
a = a^b;
printf("a=%d b=%d\n, a, b);
總的來說,使用第一種藉助第三變數方法更為直觀,異或的方法也不會存在缺陷。這是兩種較為常用的方法,但值得注意的是 ,在使用指標變數做交換時,形參的改變並不會影響實參的改變,採用單向值傳遞的方法,應該使他們的地址進行交換。