交换两数,不用辅助空间
用代码如何交换两个数,一般我们都会想到用第三个辅助的数(空间),比如:
#include<stdio.h>
int main()
{
int a=1;
int b=10;
int temp;
printf("a=%d,b=%d\n", a, b);
temp=a;
a=b;
b=temp;
printf("a=%d,b=%d\n", a, b);
return 0;
}
结果如下:
但是如果我们要求不使用额外的辅助空间呢?
我们可以想到加法,让temp的值为a+b;把它看成一个整体,用temp-a可以得到b,把它赋值给a,现在的a就是原来的b,所以用temp-a(就是原来的b)可以得到a。问题就解决了。代码如下:
int main()
{
int a = 1;
int b = 10;
int temp = 0;
printf("a=%d,b=%d\n", a, b);
temp = a + b;
b = temp - b;
a = temp - b;
printf("a=%d,b=%d\n", a, b);
return 0;
}
但是我们会遇到加法,有加法就要考虑到溢出的问题,那我们还可以想到异或的方法。
有以下结论:
A^0=A
A^A=0
所以有(A^A) ^ B=0 ^ B=B
代码如下:
#include<stdio.h>
//交换两数,不用辅助空间
int main()
{
int a = 10;
int b = 20;
int c = 0;
printf("a=%d,b=%d\n", a, b);
c = a^b;
b = c^b;
a = c^a;
printf("a=%d,b=%d\n", a, b);
return 0;
}在这里插入代码片
结果同上。