2017-01-09 5 views
0

У меня проблема с вычитанием с переносами на Java.BigInt Вычитание

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)); 
} 

Я не знаю, что я делаю неправильно? Мой класс добавления работает отлично, но вычитание дает мне странный ответ. Допустим, если я вычитаю 5943-3952, плохо получаю 2091. Когда мы знаем ответ 1991 года. Все мои ответы неверны только в первых двух цифрах. Помогите!!!!

+1

https://ericlippert.com/2014/03/05 /, как в отладку-стрелковая программа / – shmosel

ответ

0

Существует много плохого кода, но первое что-то, что даст вам желаемый результат:

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)); 
} 

Заметим, однако, что вы не учитывают тот факт, что левый операнд может быть меньше, чем правое, поэтому вы получите отрицательный результат. В представлении BigInt в виде массива «цифр», похоже, не существует способа представления отрицательных значений. Если есть, я этого не вижу.

Если у вас есть отрицательные значения тоже есть четыре сценария:

  • положительный - положительный: всегда вычесть наименьшее значение от самого высокого (всегда 38 - 17 и никогда 17 - 38), установите знак соответственно (например, 17 - 38 => 38 - 17 = 21, теперь отрегулируйте знак, потому что он наименьший: результат -21). Обратите внимание, что вам нужна функция для сравнения величин (т. Е. Значений в массиве независимо от знака).
  • положительный - отрицательный: добавить величины (массивы), знак положительный (например, 17 - (-38) = 17 + 38 = 55.
  • отрицательный - положительный: добавить значения, знак отрицательный (например, 17 - (+38) = -17 - 38 = - (17 + 38) = -55
  • отрицательный - отрицательный:.. в качестве первого сценария, установите знак соответственно
Смежные вопросы