2014-01-21 72 views
0

所以在我最後一個問題的代碼中有一個錯誤。我試圖修改應該添加兩個大數字作爲兩個數組的代碼(我不能使用BigIntiger,我必須自己創建該方法)。但它仍然給我錯誤的結果。添加兩個大數字pt.2

例如(我已經有這樣做的構造函數):

BigNumber dl1 = new BigNumber(1500); 
BigNumber dl2 = new BigNumber("987349837937497938943242"); 

dl3 = dl1.add(dl2); 
    System.out.println("Result: " + dl3); 

它給了我6575這是錯誤的結果。

public BigNumber add(BigNumber num2){ 

    char[] m = null; 
    long y = 0; 
    long x = 0; 
    boolean tmpBool = false; 
    boolean leftIsBigger = false; 
    String tmpString = ""; 
    int ending = 0; 

    if (this.n.length >= num2.n.length){ 
     m = new char[this.n.length + 1]; 
     y = num2.n.length; 
     x = this.n.length; 
     leftIsBigger = true; 
    } 
    else{ 
     m = new char[this.n.length + 1]; 
     y = this.n.length; 
     x = num2.n.length; 
    } 

    for(int i = 0; i < y; i++){ 
     int left = 0; 
     if(leftIsBigger) left = Character.getNumericValue(this.n[i]); 
     else left = Character.getNumericValue(num2.n[i]); 

     for(int j = 0; j < y; j++){ 
      int right = 0; 
      if(!leftIsBigger) right = Character.getNumericValue(num2.n[j]); 
      else righta = Character.getNumericValue(this.n[j]); 

      int z = left + right; 

      if(tmpBool){ 
       z++; 
       tmpBool = false; 
      } 
      if(z > 9){ 
       tmpBool = true; 
       z = z%10; 
      } 
      m[i] = Character.forDigit(z, 10); 
     } 

     ending++; 
    } 

    for(int k = ending; k < m.length - 1; k++){ 
     if (leftIsBigger){ 
      if (tmpBool){ 
       int c = Character.getNumericValue(this.n[k]); 
       if (c > 9){ 
        tmpBool = true; 
        c = c%10; 
        m[k] = Character.forDigit(c, 10); 
       } 
       else{ 
        tmpBool = false; 
        m[k] = Character.forDigit((c+1), 10); 
       } 
      } 
      else 
       m[k] = this.n[k]; 
     }else{ 
      if (tmpBool){ 
       int c = Character.getNumericValue(liczba2.n[k]); 
       if (c > 9){ 
        tmpBool = true; 
        c = c%10; 
        m[k] = Character.forDigit(c, 10); 
       } 
       else{ 
        tmpBool = false; 
        m[k] = Character.forDigit((c+1), 10); 
       } 
      } 
      else 
       m[k] = this.n[k]; 
     } 
    } 
    for (int it = m.length - 1; it >= 0; it--){ 
     tmpString += m[it]; 
    } 

    BigNumber dl = new BigNumber(tmpString); 
    return dl;  
} 
+8

*爲什麼*你不能使用BigIntegers?它是在標準的Java SE中,爲什麼重新發明輪子? – Ingo

+0

你在'else righta = Character.getNumericValue(this.n [j])中有一個拼寫錯誤',但這可能不是你的問題。 –

+0

**編輯**:關於長度檢查,沒關係檢查BigInteger源。你的課程看起來有點冗長。什麼是'BigNumber.n'? – Gorbles

回答

1

是不是在你的初始if語句在else(即檢查內部數組的長度的一個),你初始化米字符數組的this.n代替NUM2長度的問題。 N +

編輯:另外,你已經設置你的迭代的方式,我假設你的內部數組從左到右?如在索引0中是10^0,索引1是10^1,索引2是10^2等等。否則這也是一個問題。請注意,這意味着您必須在String類型構造函數中還原內部的String char數組。

1

您的代碼對於我來說太複雜了,無法搜索錯誤。恕我直言,整個「左更長」的邏輯是有缺陷的。

我會做到這一點。因此,假設我們正在對焦炭陣列與十進制數字在其中:

char [] x, y; // the operands we want to add 
char [] result = new char[max (x.length, y.length) + 1]; 
int xi = x.length-1;  // index in 1st operand 
int yi = y.length-1;  // index in 2nd operand 
int ri = result.length-1; // index in result 
boolean carry = false; 
while (xi >= 0 || yi >= 0) { 
    char xc = xi >= 0 ? x[xi--] : '0'; 
    char yc = yi >= 0 ? y[yi--] : '0'; 
    char res = xc + yc - '0'; 
    if (carry) res++; 
    carry = res > '9'; 
    if (carry) res -= 10; 
    result[ri--] = res; 
} 
assert (ri == 0); 
result[0] = carry ? '1' : '0'; 

注意,結果陣列始終爲1噸焦炭比最長的說法更長。這是不好的,因爲重複的添加會導致前面有很多0的更長和更長的陣列。 因此,如果最後一個添加沒有進位位,則將結果複製到另一個數組,或者 - 更好 - 更改算法,使其忽略前導零。

這是一個練習。