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

原创 2017年06月07日 17:18:29

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:

(1)加减法。

 a = a + b;

 b = a - b;

 a = a - b;

该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:

 a = 3.123456

 b = 1234567.000000

交换后各变量值变为:

 a = 1234567.000000

 b = 3.125000

很明显,原来a的值在交换给b的过程中发生了精度损失。

(2)乘除法。

 a = a * b;

 b = a / b;

 a = a / b;

乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。

可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。

(3)异或法。

 a ^= b;//a=a^b

 b ^= a;//b=b^(a^b)=b^a^b=b^b^a=0^a=a

 a ^= b;//a=(a^b)^a=a^b^a=a^a^b=0^b=b

异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。

第二类方法更像是玩了一个文字游戏,此种方法采用了在代码中嵌入汇编代码的方法避免了临时变量的引入,但究其本质还是会使用额外的存储空间。此种方法可以有很多种,下边列出几种:

(1)使用xchg指令,这也是比较直观、容易想到的方法,因为xchg指令的功能就是交换源操作数和目的操作数的值,这里要使用额外寄存器来暂存变量。内嵌汇编代码如下:

 _asm

 {

     mov eax,a

     xchg b,eax

     mov a,eax

 }

(2)使用额外的栈。这里使用反向的出栈顺序来完成交换。内嵌代码有如下两种形式:

 _asm

 {

     push a

     push b

     pop a

     pop b

 }

另一种形式:

 _asm push a

 a = b;

 _asm pop a

(3)使用mov指令。这种方法使用额外寄存器来暂存一个变量的值。

 _asm mov eax,a

 a = b;

 _asm mov b,eax

其实第二类方法并不合格,它虽然没有显式的使用临时变量,但还是会用到额外的存贮空间。不过也不能说没有必要掌握,从实用的角度看还是很“有用”的。不是有公司出过这样的面试题吗?“不使用加减法和异或法完成不使用中间变量交换两个数值型变量的值”。此时或许只好使用这种方法了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

c语言中不需要中间变量就能实现两个数交换的几种算法

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法。 a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型...
  • Mormont
  • Mormont
  • 2016年12月17日 22:07
  • 1850

两个变量的值交换的多种方法

在我的博客“函数参数的传递”(博客地址:http://blog.csdn.net/wxbmelisky/article/details/50833787)一文中谈到过将两个变量的值进行交换的 swa...
  • wxbmelisky
  • wxbmelisky
  • 2016年09月01日 20:48
  • 2107

C程序中交换两个变量数值,不使用第三方变量(四种方式)

在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的。通常我们的做法是(尤其在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int a,b; a=10; b=15; i...
  • lsk_wj
  • lsk_wj
  • 2016年01月03日 00:37
  • 1475

C语言交换两个变量数值的几种方法

因为经常见到这类题目,就自己总结了以下几种办法 1. 创建中间变量 这是最快也是最简单的办法,例如:#includeint main() { int a=10; int b...
  • ljx_5489464
  • ljx_5489464
  • 2015年11月25日 21:11
  • 13365

C语言小程序--交换两个变量的值

看到这个题目首先我们可以想到借助一个第三变量来实现 例如:a=10,b=20  我们想要交换a与b的值,可以借助一个第三变量temp,把a的值附给temp,把b的值给a,再把temp的值给b,就完成了...
  • her__0_0
  • her__0_0
  • 2016年03月16日 20:58
  • 5940

不用第三个变量交换两个变量的值的几种方法

第一次写Blog,心中有些激动o(∩_∩)o 。先在这儿为自己加加油~虽说只是些很简单的小程序,但是我希望自己能够一直坚持下去——做最好的自己,我能!     学过编程的人都知道,在交换两个变量的值时...
  • u011433274
  • u011433274
  • 2013年11月13日 00:21
  • 3662

交换两个变量的值,不使用第三个变量的四种方法

通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特...
  • yy763496668
  • yy763496668
  • 2016年06月14日 19:25
  • 1236

不用额外变量交换两个整数的值

不用额外变量交换两个整数的值 【题目】   如何不用任何额外变量交换两个整数的值? 【解答】   使用位运算的异或运算,或者使用加法运算   a异或b的结果是c,那么c就是a整数位信息和b整数位信息的...
  • u010456903
  • u010456903
  • 2015年10月04日 23:01
  • 1089

交换两个变量的值,不使用第三个变量的四种法方

通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特...
  • KangKermit
  • KangKermit
  • 2014年03月17日 09:32
  • 34844

不用第三方变量如何交换两个数的值

如果要交换两个变量的值,我们首先想到的就是定义一个第三方变量暂存其中一个变量的值:                   如果我们不使用第三方变量怎么交换两个变量的值呢?          ...
  • pt666
  • pt666
  • 2017年04月23日 19:59
  • 644
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不使用中间变量交换两个数值变量的值
举报原因:
原因补充:

(最多只允许输入30个字)