熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

不使用中間變量交換兩個數

2013-11-23 19:03:15  來源: Java核心技術 

  在程序中實現交換兩個數的功能並不復雜但如果不使用中間變量就需要動一下腦筋在本文介紹了兩個方法(其實原理都是一個)其基本原理就是數的中和也就是說通過某種運算(二元運算)將a和b兩個數變成一個數並保存在其中一個變量中然後再通過同樣的運算符將a或b中和掉這樣實際上是利用了a或b本身作為了中間變量
   
    先看第一個算法
   
    static class Num
   
    {
   
    int a;
   
    int b;
   
    }
   
    public static void swap(Num num)
   
    {
   
    numa = numa + numb;
   
    numb = numa numb;
   
    numa = numa numb;
   
    }
   
    上面代碼通過+運算符將a和b的運算結果賦給了a(這時a是中間變量)然後再計算b這時a的值已經是(a+b)了因此a再減b就是原來的a 而這時b已經是原來的a了因此再用運算後的a(實際上是a+b)減運算後的b(實際上是原來的a)就是原來的b了最後將這個b賦值給a
   
    實際上我們還可以使用*/等符號來實現同樣的效果代碼如下
   
    public static void swap(Num num)
   
    {
   
    numa = numa * numb;
   
    numb = numa / numb;
   
    numa = numa / numb;
   
    }
   
    public static void swap(Num num)
   
    {
   
    numa = numa numb;
   
    numb = numa + numb;
   
    numa = numb numa;
   
    }
   
    上面代碼在Java中沒有什麼問題(但使用/分母和分子不能為就算溢出也會得到正確的結果但有某些語言中(如C語言)可能會拋出溢出錯誤不了避免這種錯誤可以加判斷代碼如下
   
    public static void swap(Num num)
   
    {
   
    // 不同符號
   
    if (numa * numb <=
   
    {
   
    numa = numa + numb;
   
    numb = numa numb;
   
    numa = numa numb;
   
    }
   
    else
   
    {
   
    numa = numa numb;
   
    numb = numa + numb;
   
    numa = numb numa;
   
    }
   
    }

  當然我們還有更好的方法就是使用異或運算符我們知道任何數與異或後仍然為它本身兩個相同的數異或後為根本這種特性可以有如下代碼
   
    public static void swap(Num num)
   
    {
   
    numa = numa ^ numb;
   
    numb = numa ^ numb;
   
    numa = numa ^ numb;
   
    }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26199.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.