交換
題目:給定兩個整形變量的值,將兩個值的內容進行交換。
思路:創建一個臨時變量,交換兩個數的內容
代碼實現:
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編譯器
如果有誤,希望指出