两个数a,b之间如何实现交换呢?
我先想到了最简单的方法一,就是先创建一个新的临时变量t,然后实现交换。
思想:就是先把a赋值给t,这样a就空置了,再把b赋值给a,最后把t在赋值给b就实现了两数的交换了。
完整代码:
#include<stdio.h>
int main()
{
int a=3, b=5;
{
int t=0;
{
t=a;
a=b;
b=t;
}
printf(" %d,%d\n ",a ,b);
}
return 0;<pre name="code" class="objc">}
大家都知道指针是C语言的核心嘛,所以可不可以用指针来实现两个数的交换呢,因此,方法二就产生了。
思想:在主函数中通过调用Swap函数实现两数的交换。
完整代码:
#include<stdio.h>
void Swap(int *x,int *y)
{
int t = 0;
{
t=*x;
*x=*y;
*y=t;
}
}
int main()
{
int a = 3;
int b = 5;
Swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
然而这种方法看着挺麻烦的呢,然后思考,可不可以不用创建临时变量变量就实现交换呢?毕竟三个变量占内存,可不可以只用两个变量进行一些就解决问题呢,于是就有了方法三的产生。
思想:只通过两数的简单运算(加,减,乘,除),并不借助第三变量实现交换。
完整代码:
#include< stdio.h >
int main()
{
int a=3, b=5;
{
a=a+b;
b=a-b;
a=a-b;
}
printf(" %d %d\n ",a, b);
return 0;
}
说明·:在这个代码中,可以将加减运算换成乘除运算,不过这个方案有弊端,当两数较大时,容易产生溢出,超出空间范围。
在这里说明一下,int类型的范围:-32768~32767
所以,第四种方法就解决了这种溢出的问题。
思想:用异或运算代替加减乘除运算。
完整代码:
#include<stdio.h>
int main()
{
int a=3, b=5;
{
a=a^b;
b=b^a;
a=a^b;
}
printf(" %d %d\n ",a, b);
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="objc"> return 0;
}
说明:
二进制异或运算:先将十进制数换成二进制数,然后二者比较,相同为0,相异为1。
例如:a=5(二进制为00000101)
b=7(二进制为00000111)
a与b异或,结果为00000011(3)