当前位置: 代码迷 >> 综合 >> 交换--Swap
  详细解决方案

交换--Swap

热度:122   发布时间:2023-10-15 11:22:11.0

交换
题目:给定两个整形变量的值,将两个值的内容进行交换。
思路:创建一个临时变量,交换两个数的内容
代码实现:

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