笔试:交换两个int的值,且不使用第三个变量的引入

时间:2023-01-24 14:56:59

初级解法:

#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;
}

补充:

进入企业:要学会使用建立临时变量的方法,可提高代码的可读性和执行效率

异或操作:可读性差 执行效率低于其他方法