不使用第三个变量的情况下交换两个整型变量的值

链接:[url]http://hanghang.name/a-program-written-test.html[/url]

当时在考场上的想法就是用栈的先进后出(FILO)特性来实现,但是栈的定义实现和相关函数的定义实现上感觉写的不是很好,写的不顺畅。结束后才后知后觉的想到其实栈和相关函数的定义实现等声明一下即可,一般来说不需要写出来的,重点偏移了,浪费时间不讨好。考试后 Google 了一下,找到另外一些比较特别的解法,总结记录一下。

1、栈实现。不多解释了,栈和相关函数定义省去。

1 int exchange(int x,int y)
2 {
3 stack S;
4
5 push(S,x);
6 push(S,y);
7
8 x=pop(S);
9 y=pop(S);
10 }

2、算术运算。很巧的方法,比较考验算法积累。缺点是只能用于数字类型,字符串之类的就不可以了。

//假设 x=3,y=4;
x=x+y;//x=7
y=x-y;//y=3
x=x-y;//x=4
但是这样做有一个缺陷,假设它运行在vc6环境中,那么int的大小是4 Bytes,所以int变量所存放的最大值是2^31-1即2147483647,如果我们令a的值为2147483000,b的值为1000000000,那么a和b相加就越界了。
事实上,从实际的运行统计上看,我们发现要交换的两个变量,是同号的概率很大,而且,他们之间相减,越界的情况也很少,因此我们可以把上面的加减法互换,这样使得程序出错的概率减少:
int a=5,b=10;
a-=b; //a=-5,b=10
b+=a; //a=15,b=5
a+=b; //a=10,b=5

又看到一篇类似的文章,但是分析的更透彻。
分享:[url]http://hi.baidu.com/yarmu/blog/item/ddad0ef39a0b36cf0b46e00d.html[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值