2011-02-14 50 views
0

我被告知我必須寫一個BigInteger類,我知道有一個,但我必須自己寫。我將採用整數或字符串,並將它們轉換爲數組來存儲它們。從那裏開始,我可以對這些數字進行加,減和乘。我已經把整數和字符串都做好了,並且讓數組很好。我有其他問題。BigInteger需要幫助的作業

對於添加,我試圖做一些檢查數字類型數組的大小,然後設置哪些越來越小。從那裏,我有它循環,直到它到達較小的一端,並且隨着它循環它將兩位數字的該部分的數字,並添加它們。現在可以,直到他們大於10歲,在這種情況下,我需要攜帶一個號碼。我想我也有這個工作。

請記住我的BigInt所具有的兩件事是數字的數組和一個int符號,1或-1。

所以在這種情況下,我有問題,它添加正確的符號是正確的。與減法相同。

至於乘法,我完全失去了,甚至沒有嘗試過。以下是我嘗試過的一些代碼:(add函數),請幫助我。

public BigInt add(BigInt val){ 

     int[] bigger; 
     int[] smaller; 
     int[] dStore; 
     int carryOver = 0; 
     int tempSign = 1; 

     if(val.getSize() >= this.getSize()){ 
      bigger = val.getData(); 
      smaller = this.getData(); 

      dStore = new int[val.getSize()+2]; 

      if(val.getSign() == 1){ 
       tempSign = 1; 
      }else{ 
       tempSign = -1; 
      } 

     }else{ 

      bigger = this.getData(); 
      smaller = val.getData(); 

      dStore = new int[this.getSize()+2]; 

      if(this.getSign() == 1){ 
       tempSign = 1; 
      }else{ 
       tempSign = -1; 
      } 
     } 


     for(int i=0;i<smaller.length;i++){ 
      if((bigger[i] < 0 && smaller[i] < 0) || (bigger[i] >= 0 && smaller[i] >= 0)){ 
       dStore[i] = Math.abs(bigger[i]) + Math.abs(smaller[i]) + carryOver; 
      }else if((bigger[i] <= 0 || smaller[i] <= 0) && (bigger[i] > 0 || smaller[i] > 0)){ 
       dStore[i] = bigger[i] + smaller[i]; 
       dStore[i] = Math.abs(dStore[i]); 
      } 
      if(dStore[i] >= 10){ 
       dStore[i] = dStore[i] - 10; 
       if(i == smaller.length - 1){ 
        dStore[i+1] = 1; 
       } 
       carryOver = 1; 
      }else{ 
       carryOver = 0; 
      } 
     } 

     for(int i = smaller.length;i<bigger.length;i++){ 
      dStore[i] = bigger[i]; 
     } 

     BigInt rVal = new BigInt(dStore); 
     rVal.setSign(tempSign); 

     return rVal; 
+1

對於所有三種操作(加法,減法和乘法),最簡單的實現方法是實現您在小學時用於在紙上執行這些操作的相同算法。祝你好運! – 2011-02-14 04:15:10

+0

您是否向前或向後存儲值?您的添加算法似乎從左向右添加,除非您將數字保存爲反向,否則您使用的變體添加算法與您在小學時學到的算法略有不同,這是錯誤的。 – muddybruin 2011-02-14 04:33:52

+0

我有相反的數組中的數字,是的。 – Tempus35 2011-02-14 04:35:22

回答

1

如果它們的符號不同,則需要實際減去數字(並在適當的情況下借用)。此外,它看起來像你的攜帶功能不能運行超過較小數字的長度(攜帶「1」被覆蓋)。

爲了進一步進入的跡象,你有幾個不同的情況(假設這是積極的和val爲負這種情況下):

  1. 如果有多個數字,那麼你要減val從這裏,結果將是積極的
  2. 如果val有更多的數字,那麼你會想從val中減去它,結果將是負數
  3. 如果他們有相同的數字位數,必須掃描以找出哪個更大(從最高有效位開始)。

當然,如果兩者都是正數,那麼您只需按正常方式添加,如果兩者均爲負數,則添加,然後將結果設置爲負值。

2

,如果你知道如何add並用手multiply大的數字,用Java實現這些算法不會很困難。

0

我已經在幾年前寫了一個大數字庫,如果有幫助,我可以在這裏添加乘法代碼。我對你的建議不是嘗試自己編寫這些功能。已經有已知的方法可以用bignumbers添加,減去,乘,除,powmod,xgcd等等。我記得我正在閱讀布魯斯·施奈爾的應用密碼學書籍,以及蘭德爾·海德的「裝配藝術」。兩者都有所需的算法來做到這一點(僞代碼也)。我強烈建議你看看,特別是第二個,它是一個在線免費資源。

1

現在我們知道數字是反向存儲的... 我認爲您的代碼在數字都具有相同的符號的情況下工作。我嘗試了以下測試用例:

  • 相同長度,真正基本測試。
  • 長度相同,中間遺留。
  • 長度相同,末端遺留。
  • 相同的長度,殘留在中間和結束時
  • 首先數較長,殘留在中間和結束時
  • 第二數較長,殘留在中間和結束時
  • 兩個負數,第一個數字更長,在中間和末端結轉

這一切工作得很好。 然而,當一個是積極的,一個是消極的,它不能正常工作。 這並不令人感到意外,因爲-1 + 7實際上更像減法而不是加法。你應該把它想象成7-1,如果你檢查這個案例而不是調用減法,它會容易得多。 同樣,-1 - 1應該被視爲加法,即使它看起來像減法。