不用临时变量顺次交换N个变量的值
来源:互联网 发布:澳洲海淘宝宝用品 编辑:程序博客网 时间:2024/05/16 09:31
有N(N>=2)个变量,不使用临时变量,如何顺次交换它们的值?能否只用一条语句实现?如
+—+—+—+—+—+
| a | b | c | d | e |
+—+—+—+—+—+
| 1 | 2 | 3 | 4 | 5 |
+—+—+—+—+—+
要把它变为
+—+—+—+—+—+
| a | b | c | d | e |
+—+—+—+—+—+
| 2 | 3 | 4 | 5 | 1 |
+—+—+—+—+—+
怎样实现?
首先,我们考虑用异或实现两个变量的交换,可参考我的这篇文章《不用临时变量交换两个数的值》。用C++写函数如下:
int &swap(int &a, int &b)
{
b = b ^ a;
a = a ^ b;
b = b ^ a;
return b;
}
然后可以把代码优化为:
int &swap(int &a, int &b)
{
b ^= a;
a ^= b;
b ^= a;
return b;
}
继续优化,把三句压缩为一句,如下:
int &swap(int &a, int &b)
{
b ^= a ^= b ^= a;
return b;
}
还可再优化,如下:
int &swap(int &a, int &b)
{
return (b ^= a ^= b ^= a);
}
现在来顺次交换5个变量的值,如下:
swap(a, b); //返回b
swap(b, c); //返回c
swap(c, d); //返回d
swap(d, e);
既然有返回值,那么可以写成链式的,如下:
swap(a, b); //返回b
swap(swap(a, b), c); //返回c
swap(swap(swap(a, b), c), d); //返回d
swap(swap(swap(swap(a, b), c), d), e);
现在,让我们来把swap函数依次用相应的函数体替换掉,如下:
e ^= d ^= e ^= swap(swap(swap(a, b), c), d);
e ^= d ^= e ^= d ^= c ^= d ^= swap(swap(a, b), c);
e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= swap(a, b);
e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= b ^= a ^= b ^= a;
好了,最后一个语句就实现了顺次交换五个变量的值,写程序验证如下:
/********************************************************
* Copyright (c) 2005-2007 CUG-CS
* All rights reserved
*
* 文件名称:xor.c
* 简要描述:实现五个变量的顺次交换
*
* 当前版本:1.0
* 作 者:raincatss
* 完成日期:2007-10-18
* 开发环境:Windows XP Sp2 + VC6.0
* 个人博客:http://raincatss.cublog.cn/
********************************************************/
include
define PRINT(A) do {/
printf("%d/n", A);/} while (0)
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
// b ^= a ^= b ^= a; // swap(a, b)
// c ^= b ^= c ^= b; // swap(b, c)
// d ^= c ^= d ^= c; // swap(c, d)
// e ^= d ^= e ^= d; // swap(d, e)
e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= b ^= a ^= b ^= a;PRINT(a);PRINT(b);PRINT(c);PRINT(d);PRINT(e);return 0;
}
运行结果如下:
2 3 4 5 1
测试结果正确,达到预定目标。
知道了五个变量的顺次交换,那么任意多个变量的顺次交换就可以依次推导出来,在此我就不多写了。
当然,除了本文介绍的方法外,还有其它方法可以实现不用临时变量交换任意多个变量的值,读者可以自己探索一下。
参考:
http://blog.csdn.net/lpt19832003/article/details/5334688
- 不用临时变量顺次交换N个变量的值
- 不用临时变量顺次交换N个变量的值
- 不用临时变量顺次交换N个变量的值
- 不用临时变量的交换
- 被问到的面试题答案。不用临时变量交换2个变量的值。
- 不用临时变量交换两个变量的值
- 不用临时变量也可以交换变量的值
- 不用临时变量,交换两个变量的值
- 不用临时变量也可以交换变量的值
- 不用临时变量也可以交换变量的值
- 不用临时变量交换两个变量的值
- 【转】不用临时变量也可以交换变量的值
- 不用临时变量交换两个变量的值
- 不用临时变量交换两变量的值
- 交换两个整数值,不用临时变量
- 交换两个值,而不用临时变量
- 不用第三个变量交换2个变量的值
- 不用临时变量交换两个数的值
- CAKeyframeAnimation + RMMap 闪退的问题
- 黑马程序员----[20150527][张孝祥7K面试][交通灯管理系统]
- Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded
- opencv 仿射变换 根据眼睛坐标进行人脸对齐 计算变换后对应坐标
- 机器学习
- 不用临时变量顺次交换N个变量的值
- 利用AVX指令集实现矩阵乘法
- WinDbg学习笔记(二)--字符串访问断点
- 构造函数和析构函数的调用问题
- 等待解决的ACM题目
- 视频二值化处理基本方法以及简单代码实现
- 黑马程序员——装饰设计模式
- Windows 7 下 Quick-Cocos2d-x 3.3 集成 protobuf
- google hack