swap 三种求法
2015-09-01 09:54
183 查看
原文地址 http://blog.chinaunix.net/uid-26642637-id-3290611.html
问题描述:
假设有两个整数A=8,B=9 ,现在要交换A和B的值,使得A=9,B=8.
原理分析:
方法一:利用一个辅助空间C,然后先将A中的数据放在C中,然后再将B中的数据放到A中,最后再将C中的数据放到A中,这样就可以实现数据的交换了。
C语言代码实现(子函数):
点击(此处)折叠或打开
void swap1(datatype *a,datatype *b)
{
datatype tmp=*a;
*a=*b;
*b=tmp;
}
方法二:为了节省一个辅助空间,首先将A+B的和存储在A中,这一步可能会出现溢出的问题,所以这个方法不是很好的做法,不过这个方法提供了一个思路。然后将改变后的A减去B赋值给B,这样B中存放的就是原来A的值,最后再将A-B的值赋值给A。这就实现交换数据的功能。
(注意:这个方法可能会产生溢出)
C语言代码实现:
点击(此处)折叠或打开
void swap2(datatype *a,datatype *b)
{
*a+=*b;
*b=*a-*b;
*a-=*b;
}
方法三:方法二已经提供了一个不错的思想,就是利用数据的冗余来解决这个问题。只是这个加法会产生数据溢出。那我们可以考虑用逻辑运算来解决这个问题。异或运算有一个特点:A^B^B=A.
可以利用A来存储A异或B的值,然后再将A异或B存到B中,这样就实现了B中存放A原来的数据,然后用同样的方法取出原来B的值存放到A中。
C语言代码实现:
点击(此处)折叠或打开
void swap3(datatype *a,datatype *b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}
问题描述:
假设有两个整数A=8,B=9 ,现在要交换A和B的值,使得A=9,B=8.
原理分析:
方法一:利用一个辅助空间C,然后先将A中的数据放在C中,然后再将B中的数据放到A中,最后再将C中的数据放到A中,这样就可以实现数据的交换了。
C语言代码实现(子函数):
点击(此处)折叠或打开
void swap1(datatype *a,datatype *b)
{
datatype tmp=*a;
*a=*b;
*b=tmp;
}
方法二:为了节省一个辅助空间,首先将A+B的和存储在A中,这一步可能会出现溢出的问题,所以这个方法不是很好的做法,不过这个方法提供了一个思路。然后将改变后的A减去B赋值给B,这样B中存放的就是原来A的值,最后再将A-B的值赋值给A。这就实现交换数据的功能。
(注意:这个方法可能会产生溢出)
C语言代码实现:
点击(此处)折叠或打开
void swap2(datatype *a,datatype *b)
{
*a+=*b;
*b=*a-*b;
*a-=*b;
}
方法三:方法二已经提供了一个不错的思想,就是利用数据的冗余来解决这个问题。只是这个加法会产生数据溢出。那我们可以考虑用逻辑运算来解决这个问题。异或运算有一个特点:A^B^B=A.
可以利用A来存储A异或B的值,然后再将A异或B存到B中,这样就实现了B中存放A原来的数据,然后用同样的方法取出原来B的值存放到A中。
C语言代码实现:
点击(此处)折叠或打开
void swap3(datatype *a,datatype *b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}
相关文章推荐
- 软件设计师中常考易混淆点:媒体的分类和风险
- /usr/bin/ld: i386 architecture of input file `regcomp.o' is incompatible with i386:x86-64 output
- 【伯乐在线】什么是堆和栈,它们在哪儿?
- 【伯乐在线】什么是堆和栈,它们在哪儿?
- 跨域http请求
- Annex B 基础编码规则-标签长度值数据对象格式 155
- 格式化I/O和文本行I/O异同
- json-lib 的maven dependency
- 封装和继承
- HDU——2612 Find a way(广搜)
- tap/click on search button on softkeyboard
- HTML5本地数据库(WebSQL)[转]
- java 远程调试 Tomcat配置远程调试
- iOS设置状态栏字体颜色,是否隐藏等
- UITablView上下滑动控制底部按钮的出现和消失
- Amoeba读写分离log
- eclipse的常用快捷键
- Altium Designer笔记之在原理图中移动元件并保持元件上导线的连接(尤指拖动)
- Spark学习笔记之-Spark远程调试
- C#时间相关