有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