交换--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编译器
如果有误,希望指出

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