交换两个数的值

s11ss 2011-06-25 02:10:51
有A = 1, B = 2。交换它们的值,看有多少种方法!
...全文
152 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
五哥 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yqdragon 的回复:]
加减法


Delphi(Pascal) code
procedure TFrmMain.Button5Click(Sender: TObject);
var
a,b:integer;
begin
a := 1;
b := 2;
a := a + b;
b := a - b;
a := a - b;
showmessage(inttostr(a……
[/Quote]
+我喜欢这种...
s11ss 2011-06-25
  • 打赏
  • 举报
回复
其实我想得很简单,就是再声明C, D:
C := A;
D := B;
交换:
A := D;
B := C;
呵呵
s11ss 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sailxia 的回复:]
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:
(1)加减法。

a = a + b;

b = a - b;

a = a - b;

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

a = 3.123456

b = 1234567.000000

交……
[/Quote]嗯,很好。还有吗
s11ss 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sgzhou12345 的回复:]
楼主,想干什么呀????????????
[/Quote]
[Quote=引用 5 楼 wpf517 的回复:]
楼主你不是做毕业设计啊? 具体什么需求说明白,就是交换两个数的值?
[/Quote]
就是收集一下交换两个数的值的方法啊!
Frank.WU 2011-06-25
  • 打赏
  • 举报
回复
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:
(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

其实第二类方法并不合格,它虽然没有显式的使用临时变量,但还是会用到额外的存贮空间。不过也不能说没有必要掌握,从实用的角度看还是很“有用”的。不是 有公司出过这样的面试题吗?“不使用加减法和异或法完成不使用中间变量交换两个数值型变量的值”。此时或许只好使用这种方法了。
Frank.WU 2011-06-25
  • 打赏
  • 举报
回复
你还可以使用汇编。。。
山东蓝鸟贵薪 2011-06-25
  • 打赏
  • 举报
回复
给分吧楼主
我们的帖子中都有答案.............
hongss 2011-06-25
  • 打赏
  • 举报
回复
  tmp:= a;
a:= b;
b:= tmp;
wpf517 2011-06-25
  • 打赏
  • 举报
回复
楼主你不是做毕业设计啊? 具体什么需求说明白,就是交换两个数的值?
山东蓝鸟贵薪 2011-06-25
  • 打赏
  • 举报
回复
楼主,想干什么呀????????????
yqdragon 2011-06-25
  • 打赏
  • 举报
回复
加减法

procedure TFrmMain.Button5Click(Sender: TObject);
var
a,b:integer;
begin
a := 1;
b := 2;
a := a + b;
b := a - b;
a := a - b;
showmessage(inttostr(a));
showmessage(inttostr(b));
end;
yqdragon 2011-06-25
  • 打赏
  • 举报
回复
异或法:
var
a,b:integer;
begin
a := 1;
b := 2;
a := a xor b;
b := b xor a;
a := a xor b;
end;
山东蓝鸟贵薪 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 s11ss 的回复:]
有A = 1, B = 2。交换它们的值,看有多少种方法!
[/Quote]
再定义个中间变量C
c=a
a=b a=2
b=c b=1

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧