程序实现两个整型数值的交换

Posted sunjiyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序实现两个整型数值的交换相关的知识,希望对你有一定的参考价值。

题目:请写出一个小程序,实现对两个整型数值一个和b的交换

思路1:交换两个数值,最一般的做法,是创建一个临时变量临时,这个变量我们需要的不是它具体的值起到什么作用,而是要借用它所开辟出来的空间,进行被交换变量的暂时存放将一个的值存入临时,再将b存入一个中,然后再将温度里存的一个的值放入b中,即可实现一个与b的交换,如图:

技术分享图片技术分享图片?

技术分享图片
 1  #include<stdio.h>
 2  
 3  int main()
 4  {
 5  
 6      int a = 10, b = 20;
 7      int temp;
 8      printf("交换前:a=%d,b=%d
", a, b);
 9       
10      temp = a;
11      a = b;
12      b = temp;
13  
14      printf("交换后:a=%d,b=%d
", a, b);
15     
16      return 0;
17  }
View Code

 

 

技术分享图片

则其结果:

技术分享图片

 

那么像这样的题目,有没有值得优化的地方呢。当然是有的,比如,假设现在禁止使用这个中间变量温度,难道就不能再进行交换了吗。当然是可以的,这里给出优化的思路2,比如可以使用数值计算的方法,如图分析

 

代码实现:

技术分享图片
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a = 10, b = 20;
 5     printf("交换前:a=%d,b=%d
", a, b);
 6     
 7     a = a + b;
 8     b = a - b;
 9     a = a - b;
10     printf("交换后:a=%d,b=%d
", a, b);
11     
12     return 0;
13 }
View Code

 

技术分享图片

这里并不用担心数字大小的问题,因为做减法运算的变量a实际上是对a,b求和之后的结果覆盖了。变量值已经发生变化了。故而结果仍旧在预期:

 技术分享图片

 

但是这个做法有没有问题呢?当然是有的,因为我们知道整型值的存储是有取值范围的,当我们的变量进行相加时,需要注意的是,如果数值很小,是没有问题的。比如现在要交换的两个值进行相加,结果他们的和超过了范围,那么会发生溢出,这时在使用加法运算就有问题了,并且如果是想要引申到浮点型数据的交换,就会发生精度损失,那么就可以看出,思路2也是有缺陷的

优化思路3:运用位运算操作符异或^

异或的功能是两个二进制值相同结果为0,相异结果为1,这里将a和b先分别转化为二进制数,让a与b异或,再让得出的结果分比对a和b进行异或操作。可以看出异或的结果就如同一串密码,一次异或相当于加密,两次异或相当于解密

技术分享图片技术分享图片?

代码实现:
技术分享图片
 1 #include<stdio.h>
 2 
 3 
 4 int main()
 5 {
 6     int a = 10, b = 20;
 7     
 8     printf("交换前:a=%d,b=%d
", a, b);
 9     
10     a ^= b;
11     b ^= a;
12     a ^= b;
13     
14     printf("交换后:a=%d,b=%d
", a, b);
15     
16     return 0;
17 }
View Code

 

技术分享图片技术分享图片

 

技术分享图片?

采用异或就可以避免数据过大造成的溢出了,原因是,异或其实也被称为不进位加法,它既然结果不会发生进位,那么只要参与交换的变量取值没有溢出,进行异或操作就永远不会发生溢出。

当然异或操作进行交换,也不是没有局限性的。

作为二进制进行为操作运算,故而这个方法就只适用于整型值之间的交换了。

以上是关于程序实现两个整型数值的交换的主要内容,如果未能解决你的问题,请参考以下文章

三种方法实现整型数值交换

交换两个整形变量的数值

经典算法学习——交换两个整型数据

不用中间变量交换两个数值变量的值

物品交换(变量)

Java整型变量和整型常量4 Java变量交换的两种方式无第三方变量