1. 程式人生 > >c語言:多種方法實現兩個數的交換

c語言:多種方法實現兩個數的交換

交換兩個數的內容是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);

總的來說,使用第一種藉助第三變數方法更為直觀,異或的方法也不會存在缺陷。這是兩種較為常用的方法,但值得注意的是 ,在使用指標變數做交換時,形參的改變並不會影響實參的改變,採用單向值傳遞的方法,應該使他們的地址進行交換。