如何不使用第三個變量來交換兩個數的值


  最近在看《c++從入門到精通》自學c++,里面有一道課后題是如何做到不適用第三個變量來交換兩個數的值,以下是我在網上查找到的資料,記錄下並作為筆記。

      題目:a=10,b=15,將a / b的值互換。

      通常我們的做法是(尤其是在學習階段):定義一個新的變量,借助它完成交換。代碼如下:
      int a,b;
      a=10; b=15;
      int t;
      t=a; a=b; b=t;
      這種算法易於理解,特別適合幫助初學者了解計算機程序的特點,是賦值語句的經典應用。在實際軟件開發當中,此算法簡單明了,不會產生歧義,便於程序員之間的交流,一般情況下碰到交換變量值的問題,都應采用此算法(以下稱為標准算法)。

      上面的算法最大的缺點就是需要借助一個臨時變量。那么不借助臨時變量可以實現交換嗎?答案是肯定的!

      1) 算術運算
      簡單來說,就是通過普通的+和-運算來實現。代碼如下:
      int a,b;
      a=10;b=12;
      a=b-a; //a=2;b=12
      b=b-a; //a=2;b=10
      a=b+a; //a=10;b=10
      通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標准算法之后。
      它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。
      具體過程:第一句“a=b-a”求出ab兩點的距離,並且將其保存在a中;第二句“b=b-a”求出a到原點的距離(b到原點的距離與ab兩點距離之差),並且將其保存在b中;第三句“a=b+a”求出b到原點的距離(a到原點距離與ab兩點距離之和),並且將其保存在a中。完成交換。
      此算法與標准算法相比,多了三個計算的過程,但是沒有借助臨時變量。(以下稱為算術算法)

      該算法還可以這樣做:

      int a,b;

      a=10;b=12;

      a=a+b=22;

      b=a-b=10;

      a=a-b=12;

      兩個減操作一個加操作,執行的先后順序不一樣,其原理也稍微有些區別,但根本原理是一樣滴。

      3) 位運算
      通過異或運算也能實現變量的交換,這也許是最為神奇的,請看以下代碼:
      int a=10,b=12; //a=1010^b=1100;
      a=a^b; //a=0110^b=1100;
      b=a^b; //a=0110^b=1010;
      a=a^b; //a=1100=12;b=1010;
      此算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使數據中的某些位翻轉,其他位不變。這就意味着任意一個數與任意一個給定的值連續異或兩次,值不變。
      即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理可以得到a=b^a^a=b;輕松完成交換。

      以上三個算法均實現了不借助其他變量來完成兩個變量值的交換,相比較而言算術算法和位算法計算量相當,地址算法中計算較復雜,卻可以很輕松的實現大類型(比如自定義的類或結構)的交換,而前兩種只能進行整形數據的交換(理論上重載“^”運算符,也可以實現任意結構的交換)。

     

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM