交換--Swap

交換
題目:給定兩個整形變量的值,將兩個值的內容進行交換。
思路:創建一個臨時變量,交換兩個數的內容
代碼實現:

void Swap(int *pa,int *pb)
{
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}

如果要求不能創建臨時變量,來交換兩個數。
思路:把兩個數用數學方法交換。
eg:
(1)加減法。(a=1,b=2)
a=a+b; “a(1)+b(2)”的和(3)賦給a.
b=a-b; “和(3)-b(2)”的差(1)賦給b.——b=1
a=a-b; “和(3)-b(1)”的差(2)賦給a.——-a=2
代碼實現:

void Swap(int *pa,int *pb)
{
    *pa = *pa + *pb;
    *pb = *pa - *pb;
    *pa = *pa - *pb;
}

(2)乘除法。 (同加減法)
a = a*b;
b = a/b;
a = a/b;
代碼實現:

void Swap(int *pa,int *pb)
{
    *pa = *pa * *pb;
    *pb = *pa/ *pb;
    *pa = *pa/ *pb; 
}

(3)異或。(a=1(0001),b=(0010))省略前28個0
a = a^b; 0001^0010=0011
b = a^b; 0011^0010=0001——-b=0001
a = a^b; 0011^0001=0010——-a=0010
它們雖不用開闢空間,但有弊端,如果這兩個數較大的話,兩數相加會溢出,則不安全,乘除法亦相同。
異或,如果你傳了同一個數(同一個地址)異或就會出錯,當然不會去交換同一個數,但是爲了代碼的嚴謹性,在異或前應先判斷是否時同一個地址

void Swap(int *pa,int *pb)
{
    if(pa==pb)
        return;
    *pa = *pa^ *pb;
    *pb = *pa^ *pb;
    *pa = *pa^ *pb;
}

我在VS2010編譯器
如果有誤,希望指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章