不用临时变量顺次交换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

0 0
原创粉丝点击