2017-01-09 6 views
0

Ich habe ein Problem versucht, mit Carrys in Java zu subtrahieren.BigInt Subtraktion

public BigInt add(BigInt o) { 
    int carry = 0; 
    int max = n.length > o.n.length ? n.length : o.n.length; 
    int[] result = new int[max+1]; 

    for (int i = 0; i <= max; ++i) { 
     int top = i < n.length ? n[i] : 0; 
     int bot = i < o.n.length ? o.n[i] : 0; 

     result[i] = (top + bot + carry) % 10; 
     carry = (top + bot + carry)/10; 
    } 

    return new BigInt(trim(result)); 
} 

public BigInt sub(BigInt o) { 
    int carry = 0; 
    int max = n.length > o.n.length ? n.length : o.n.length; 
    int[] result = new int[max+1]; 

    for (int i = 0; i <= max; ++i) { 

     int top = i < n.length ? n[i] : 0; 
     int bot = i < o.n.length ? o.n[i] : 0; 

     carry = (top + bot + carry)/10; 
     result[i] = (10 + top - bot - carry) % 10; 
    } 

    return new BigInt(trim(result)); 
} 

Ich weiß nicht, was ich falsch mache? Meine Additionsklasse funktioniert perfekt, aber Subtraktion gibt mir eine seltsame Antwort. Nehmen wir an, ich subtrahiere 5943-3952 und bekomme 2091. Wenn wir wissen, ist die Antwort 1991. Alle meine Antworten sind nur in den ersten beiden Ziffern falsch. Hilfe!!!!

+1

https://ericlippert.com/2014/03/05/how-to-debug-small-programme / – shmosel

Antwort

0

Es gibt eine Menge falsch mit Ihrem Code, aber zuerst etwas, dass Sie das gewünschte Ergebnis geben wird:

public BigInt sub(BigInt o) 
{ 
    int carry = 0; 
    int max = n.length > o.n.length ? n.length : o.n.length; 
    int[] result = new int[max+1]; 

    for (int i = 0; i <= max; ++i) 
    { 
     int top = i < n.length ? n[i] : 0; 
     int bot = i < o.n.length ? o.n[i] : 0; 

     int res = top - bot - carry; 

     result[i] = (10 + res) % 10; 
     carry = res < 0 ? 1 : 0; 
    } 

    return new BigInt(trim(result)); 
} 

Beachten Sie jedoch, dass Sie nicht die Tatsache berücksichtigen Sie, dass der linke Operand sein könnte kleiner als das Recht, so würden Sie ein negatives Ergebnis erhalten. In Ihrer Darstellung eines BigInt als ein Array von "Ziffern" scheint es keine Möglichkeit zu geben, negative Werte darzustellen. Wenn es ist, sehe ich es nicht.

Wenn Sie negative Werte haben auch gibt es vier Szenarien:

  • positiv - positiv: immer niedrigste Wert subtrahieren von der höchsten (immer 38-17 und nie 17-38), Zeichen entsprechend anpassen (zB 17 - 38 => 38 - 17 = 21, passe nun das Vorzeichen an, denn das erste ist am kleinsten: result -21). Beachten Sie, dass Sie eine Funktion benötigen, um die Größen zu vergleichen (d. H. Die Werte im Array unabhängig vom Vorzeichen).
  • positiv - negativ: addieren Sie die Größen (Felder), Vorzeichen ist positiv (zB 17 - (-38) = 17 + 38 = 55.
  • negativ - positiv: addieren Sie die Größen, Vorzeichen ist negativ. 17 - (+38) = -17 - 38 = - (17 + 38) = -55
  • negativ - negativ:.. als erstes Szenario einstellen Zeichen entsprechend