初级解法:
#include<stdio.h>
int main()
{
int a=3;
int b=5;
printf("交换前:a=%d b=%d\n",a,b);
a=a+b;//a变成了两个数字的和 但b还是原来的b
b=a-b;//得到了原来的a,将原来的a放入b
a=a-b;//得到了原来的b,将原来的b放入a
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
解析:
a=a+b;//a变成了两个数字的和 但b还是原来的b
b=a-b;//得到了原来的a,将原来的a放入b
a=a-b;//得到了原来的b,将原来的b放入a
也可以理解为先把b放到a里面去,把原来的单独的a拿到b,原来的b继续占着a的位置
有问题:
可能会有溢出的可能性
int是四个字节 占32个空间,所以整型一定是有最大值的“2147483647”
如果a和b的和放如a的时候 最大值超过了整型最大值,则这个算法就不科学
解决问题:
^按位(二进制)异或
异或:相同为0,相异为1
值 | 二进制 |
a=3 | 011 |
b=5 | 101 |
a=a^b | a:110 b:101 |
b=a^b | b:011 a:110 |
a=a^b | a:101 b:011 |
完善解法:
#include<stdio.h>
int main()
{
int a=3;
int b=5;
printf("交换前:a=%d b=%d\n",a,b);
a=a^b;
b=a^b;
a=a^b;
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
补充:
进入企业:要学会使用建立临时变量的方法,可提高代码的可读性和执行效率
异或操作:可读性差 执行效率低于其他方法
标签:int,笔试,交换,第三个,异或,printf,原来,放入 From: https://blog.51cto.com/u_15899086/6022303