zoukankan      html  css  js  c++  java
  • 不用临时变量顺次交换N个变量的值

    有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

  • 相关阅读:
    ASP创建对象及中文显示解决方法
    webservice解读
    top监控工具
    Crontab实例
    javascript闭包的理解
    98万买下51.com域名,51.com不止2000万美金
    百度08年网页搜索份额73.2% 创历史新高
    讲故事投资 天使投资人的中国式生存
    下个谷歌将诞生于中国或印度
    Twitter入选10大搜索引擎
  • 原文地址:https://www.cnblogs.com/qianggezhishen/p/7349508.html
Copyright © 2011-2022 走看看