2010-01-21 2 views
0

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

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

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

т.д.

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

Редактировать я не могу просто сделать this.add(sn1) beacuse иногда я хочу, чтобы добавить положительное число к отрицательному или negitve к недостатку. Но add может обрабатывать только положительные числа. Поэтому я должен использовать базовую математику и, например: вместо добавления отрицательного числа к отрицательному числу добавьте 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(); 
} 

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

+0

Почему вы не можете просто 'this.add (sn1)' во всех случаях? –

+0

Я держу пари, что есть более простой способ написать это, но я думаю, что нам, вероятно, нужен более крупный образец вашего кода. Из какого метода эти строки? –

+0

Я не могу просто сделать this.add (sn1) beacuse иногда я хочу добавить положительное число к отрицательному или отрицательное к отрицательному. Но add может обрабатывать только положительные числа. Поэтому я должен использовать базовую математику и, например: вместо добавления отрицательного числа к отрицательному числу я добавляю this.abs() (абсолютное значение числа) в sn1.abs() и возвращаю результат с противоположным знаком. Дрю: это линии из метода _add. Я использую этот метод, чтобы решить, что делать с полученными цифрами. Отправить им добавить метод? Или отправить их на метод изъятия, но с другим порядком (sn1.subtract (this))? И так далее .. – 2010-01-21 23:06:50

ответ

0

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

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

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

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

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

private boolean isBiggerThen(BigNumber other) { 
    return this.compare(other) > 0; 
} 
+0

Спасибо, что выглядит намного более болтливым. Но есть ли способ удалить большую часть if? – 2010-01-21 23:32:07

+0

Если вы полностью перепишете его: может быть. Но попробуйте извлечь все больше и больше кода в отдельные методы. Это значительно улучшает читаемость, и вам не нужно много конструкций if-else в одном методе. Если это только для улучшения ваших навыков - продолжайте с того, что вы начали :) –

0

Нечто подобное могло бы быть более привлекательным:

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

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

+0

+1 для этого. Написание метода add() для обработки значений одним и тем же знаком является первой ошибкой liamg. Сложение и вычитание на самом деле должно быть таким же, как и с двухсторонним подходом. –

+0

Спасибо за ответы. Я думал об использовании двоичных чисел, но он выглядел слишком «низкоуровневым» для моей цели. Но я никогда не слышал об арифметике thos-комплемента, это будет полезно в моем будущем, я верю. – 2010-01-22 07:28:37

0

Несколько вещей, которые меня дезориентируют. Не следует добавлять коммутативный. то есть он должен дать тот же результат для 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); 
Смежные вопросы