关于不用第三个变量或者临时变量实现两个变量值的交换

解决问题思路

  1. 首先我们看到这个问题就应该先想如何解决这道题,解决这道题的思路是什么,有了思路我们才可以用代码去实现它。

  2. 如果没有不许用第三个变量的限制条件,我们可能都会做,觉得非常简单。一旦有了限制条件,我们就要考虑到直接赋值会让一个变量的值丢失,只要我们把这个值丢失的问题解决了,我们就可以解决掉这道题。

  3. 我们可先让变量a和变量b进行一种运算(例如+,-,^),把运算结果存储到a和b随便一个变量中,这样看似我们丢了一个变量的值,其实并没有,当我们需要用到那个值的时候,我们完全可以通过与刚才运算符对应的计算方法把刚刚被覆干掉的值找回来。(例如a=3,b=5。a+b=8,我们让a=a+b=8,看似3丢失了,其实我们可以通过8-5,即a-b把3找回来)。既然我们把值丢失的问题解决了我们接下来就可以给变量赋值了交换了。

  4. 如果你感觉上面的一段话有点抽象,难以理解,你也可以把它这样理解。假如小周抱了一个西瓜,小李抱了一个榴莲,然后不能通过中间人的接手让小周和小李把手里的水果换了。因为程序是一步一步执行的,不可能同时把a的值给b,把b的值给a。就好像小周和小李一样,他们两人都是抱着水果,不可能同时交换。只能小周先把水果给小李,或者小李先给小周,这个顺序无所谓,谁先都一样。假设小李先把榴莲给小周了,然后就要注意了,敲黑板,划重点了,这个时候小周手里抱的是什么?是西瓜和榴莲两个,不是小周把西瓜扔掉 去拿榴莲(对应到代码里面就是你不能直接把b的值给a,那样会让a的值丢失,你要把a+b的值给a,这样后边用到a的值可以后续通过a-b(这里面的a已经是a+b了)算出来)然后小李再把西瓜拿走,完成交换。

代码实现

  1. 加减法实现交换
#include 
int main() {
 int a;
 int b;
 scanf("%d%d", &a, &b);
 if (a == b){
 	printf("%d,%d\n", a, b);
  	return 0;//这里是判断如果a和b相等就不交换了
  }
 else if ((a < 0 && b < 0) || (a > 0 && b > 0))//因为两数相加可能会存在数值溢出问题,所以当两个都是正数或者都是负数的时候我们可以让a先存两数之间a-b,道理和存a+b两数之和一样
 {
  	a = a - b;
  	b = a + b;//即b=(a-b)+b,即 b=a;
  	a = b - a;//即a=b-(a-b),即 b=a;
 }
 else {    //当两个数一正一负的时候我们就可以存两数之和,这样就不会出现数值溢出问题。
  	a = a + b;
  	b = a - b;
  	a = a - b;
 }
 printf("%d,%d\n", a, b);
 return 0;
}
  1. 按位异或实现交换
    按位异或就是二进制数按照对应位进行异或运算,为什么要用到异或运算符呢?看 过下边的图你就会理解了
    关于不用第三个变量或者临时变量实现两个变量值的交换_第1张图片
    因为二进制中只有0和1,而按位异或的运算结果也只有0和1,所以当两个数按位异或出来第三个数之后,然后这三个数不管哪两个数按位异或,结果都会是三个数中的另外一个。
#include
int main() {
 int a = 5;
 int b = 6;
 a = a ^ b;//现在a=3
 b = a ^ b;//3和2按位异或还是1,即b=6
 a = a ^ b;//3和2按位异或的结果还是1,即a=5
 printf("%d,%d", a, b);
 return 0;
}

其实按位异或的原理和上边加减法的原理思路是一样的,就是按位异或有点不好理解。

总结

因为按位异或的使用条件是整数,所以这个方法就只能交换两个整数的值,上边的那个加减法通过修改也可以实现浮点数的交换。

有的人可能会问都用了加减,为什么不用乘除进行实现交换呢,我在这里不使用乘法主要是乘法可能会引起数值的溢出,而除法有可能出现浮点数,会使运算结果不准确。

如果大家有什么好的方法可以在在下边留言提出来,或者我这里面如果有错也欢迎大家指正纠错。

你可能感兴趣的:(关于不用第三个变量或者临时变量实现两个变量值的交换)