笔试:交换两个int的值,且不使用第三个变量的引入
原创
©著作权归作者所有:来自51CTO博客作者持续进化中的原创作品,请联系作者获取转载授权,否则将追究法律责任
初级解法:
#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 |
就是说,a^b得到一个新密码,然后新密码^原来的b得到原来的a,新密码^原来的a得到原来的b
完善解法:
#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;
}
补充:
进入企业:要学会使用建立临时变量的方法,可提高代码的可读性和执行效率
异或操作:可读性差 执行效率低于其他方法