Добавление отрицательных и положительных чисел в Java без BigInt - PullRequest
0 голосов
/ 22 января 2010

Я пытаюсь написать небольшой класс Java. У меня есть объект под названием BigNumber. Я написал метод, который добавляет два положительных числа, и другой метод, который вычитает два положительных числа.

Теперь я хочу, чтобы они обрабатывали отрицательные числа. Таким образом, я написал пару «если» утверждений, например.

if (this.sign == 1 /* means '+' */) {
    if (sn1.sign == 1) {
        if (this.compare(sn1) == -1 /* means this < sn1 */ ) return sn1.add(this);
        else return this.add(sn1);
    }

и т.д.

К сожалению, код выглядит просто безобразно. Как кусты если и другие. Есть ли лучший способ написать такой код?

Редактировать я не могу просто сделать this.add(sn1), потому что иногда я хочу добавить положительное число к отрицательному или отрицательное к отрицательному. Но добавить можно обрабатывать только положительные числа. Поэтому я должен использовать основную математику и, например: вместо отрицательного числа к отрицательному числу я добавляю this.abs() (абсолютное значение числа) к sn1.abs() и возвращаю результат с противоположным знаком. Дрю: это строки из метода _add. Я использую этот метод, чтобы решить, что делать с числами, которые он получает. Отправить их, чтобы добавить метод? Или отправить их для вычитания метода, но с другим порядком (sn1.subtract(this))? И так далее ..

if (this.sign == 1) {
    if (sn1.sign == 1) {
        if (this.compare(sn1) == -1) return sn1.add(this);
        else return this.add(sn1);
    }
    else if (wl1.sign == 0) return this;
    else {
        if (this.compare(sn1.abs()) == 1) return this.subtract(sn1.abs());
        else if (this.compare(sn1.abs()) == 0) return new BigNumber(0);
        else return sn1.abs().subtract(this).negate(); // return the number with opposite sign;
    }
} else if (this.sign == 0) return sn1;
else {
    if (wl1.sign == 1) {
        if (this.abs().compare(sn1) == -1) return sn1.subtract(this.abs());
        else if (this.abs().compare(sn1) == 0) return new BigNumber(0);
        else return this.abs().subtract(sn1).negate();
    } else if (sn1.sign == 0) return this;
    else return (this.abs().add(wl1.abs())).negate();
}

Как видите - этот код выглядит ужасно ..

Ответы [ 4 ]

1 голос
/ 22 января 2010

Вы можете рассмотреть возможность использования арифметики с двумя дополнениями. Это значительно упростит сложение и вычитание. Не нужно беспокоиться о знаковых битах, просто сложите числа вместе.

0 голосов
/ 12 мая 2010

Несколько вещей сбивают меня с толку. Не следует добавлять это коммутативно. то есть он должен давать тот же результат для a + b, что и b + a.

В большинстве случаев вам просто нужно определить, совпадает ли знак, чтобы добавить абсолютные значения.

, например

if (sign == sn1.sign)
   return add(sn1);// add the absolute values and keep the sign. 1 + 1 == 2, -1 + -1 == -2
if (sign == 0) return sn1;
if (sn1.sign == 0) return this;
// you only need to know which value is larger for subtraction.
// keep the sign of the first argument and substract the absolute value.
return compare(sn1) > 0 ? substract(sn1) : sn1.substract(this);
0 голосов
/ 22 января 2010

Я предлагаю вам потратить еще несколько методов;) Как насчет этого:

if (isPositive() && other.isPositive()) {
  if (this.isBiggerThen(other)) {
    return this.plus(other);
  } else {
    return other.plus(this);
  }
}

Обратите внимание, что я переименовал sn1 в other, а метод add в plus, чтобы указать, что метод возвращаетсумма для повышения читабельности.add обычно используется, если что-то добавлено к самому объекту (как в классе BigInteger).

Реализации для isPositive и isBiggerThen довольно просты:

private boolean isPositive() {
  return sign == 1;
}

private boolean isBiggerThen(BigNumber other) {
  return this.compare(other) > 0;
}
0 голосов
/ 22 января 2010

Что-то вроде этого может быть более привлекательным:

if (this.sign == 1 && sn1.sign == 1) {
    return (this.compare(sn1) < 0) ? sn1.add(this) : this.add(sn1);
}
...