2013-08-28 4 views
0

У меня возникли проблемы с работой с BigIntegers. У меня возникают проблемы с методом add в классе Rational. В конструкторе Rational(int x, int y) я пытаюсь преобразовать параметры datatype int в тип данных переменной экземпляра BigInteger, хотя использование метода toString(int n).
BigInteger Преобразование из int в BigInteger

  1. Я правильно делаю преобразование внутри конструктора Rational(int x, int y)?
  2. У них есть способ add. Я получаю сообщение об ошибке при всех n.num и n.den. Я не понимаю, почему я получаю эту ошибку. Я неправильно использую метод add из класса BigInteger? http://docs.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html

Пусть один класс имеет следующий

Rational a = new Rational(1,2); 
Rational b = new Rational(1,3); 
Rational c = new Rational(1,6); 
Rational sum = a.add(b).add(c); 
println(sum); 

и Rational класс включает

import acm.program.*; 
import java.math.*; 

public class Rational{ 

    public Rational(int x, int y) { 
     num = new BigInteger(toString(x)); 
     den = new BigInteger(toString(y)); 
    } 

    public toString(int n) { 
     return toString(n); 
    } 

    public BigInteger add(BigInteger n) { 
     return new BigInteger(this.num * n.den + n.num * this.den, this.den * n.den) 
    } 

    /* private instance variables */ 
    private BigInteger num; 
    private BigInteger den; 
} 

ответ

2

Чтобы преобразовать int в BigInteger, я бы использовал BigInteger.valueOf(int).

Кроме того, вы не можете использовать операторов с BigIntegers, вы должны использовать свои собственные методы. Ваш Митос должен быть таким:

public Rational add(Rational n) { 
    return new Rational(
      this.num.multiply(n.den).add(n.num.multiply(this.den)).intValue(), 
      this.den.multiply(n.den).intValue()); 
} 
+0

Спасибо! это работает. –

+2

Будьте осторожны с этим. Если вы добавляете много Rationals вместе, знаменатели могут взорваться экспоненциально. Например, 1/5 + 1/5 + 1/5 + 1/5 даст вам 500/625, вместо 4/5. Вы действительно хотите добавить шаг для удаления любых общих факторов между числителем и знаменателем, прежде чем возвращать новое значение. –

+0

@DavidWallace Я все еще смущен одной. Если вы посмотрите на страницу javadoc BigInteger, BigInteger использует метод 'add'. Не можете ли вы использовать этот метод в этом случае? Если нет, когда вы можете использовать метод BigInteger 'add' с этим + val на странице Javadoc? Http: //docs.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html# add (java.math.BigInteger) –

2

Простая ошибка:

public Rational add(Rational n) { 
    return new Rational(
     this.num.multiply(n.den).add(n.num.multiply(this.den)), 
     this.den.multiply(n.den)); 
} 

Кроме того, при создании нового BigInteger вы должны использовать метод valueOf(int) вместо преобразования в String

+0

Является ли ваш фрагмент кода компиляцией? – Jayamohan

+0

@JimGerrison Когда я копирую и вставляю код в Eclispe, появляется красная строка ошибки (this.num * n.den + n.num * this.den, this.den * n.den). Ошибка читается. Оператор * не определен для типа (ов) аргументов. Java.math.BigInteger, \t java.math.BigInteger \t - Оператор * не определен для типа аргументов. Java.math.BigInteger, \t java.math.BigInteger –

+1

Вам нужно будет использовать методы «multiply» и 'add' BigInteger ... I Я обновил свой ответ. –

2

1) Am I doing the conversion correctly inside the Rational(int x, int y) constructor?

Вы можете использовать

BigInteger num = BigInteger.valueOf(x); 

Изготовление Строка Первый не требуется.

2. They way the add method is written I'm getting an error ..... 

Ваш метод добавления неправильный, и его непонятно, что вы пытаетесь добиться в методе добавления. Но если вы хотите сделать дополнение в BigInteger, вы должны использовать метод BigInteger#add и для умножения между BigInteger вы должны использовать метод BigInteger#multiply.

+0

Я думаю, что буду использовать BigInteger.valueOf (x). Но если вы решили использовать toString, правильно ли использовать toString? –

+0

Нет вашего метода toString. Это должно быть 'public toString (int n) { return toString (n); } ' – Jayamohan

+1

Вы можете избавиться от своего метода toString и использовать его в классе Integer, например' num = new BigInteger (Integer.toString (x)); 'если бы вы этого хотели. Но почему бы просто не использовать 'BigInteger.valueOf (x)'? Это намного более аккуратно. –

1

Чтобы остановить знаменатели взрывают в геометрической прогрессии, я хотел бы использовать наименьшее общее кратное двух знаменателей в качестве знаменателя результата, а не их продукт. Это будет выглядеть так.

public Rational add(Rational rhs) { 
    BigInteger commonFactor = den.gcd(rhs.den); 
    BigInteger resultNumerator = 
     num.multiply(rhs.den).add(rhs.num.multiply(den)).divide(commonFactor); 
    BigInteger resultDenominator = den.multiply(rhs.den).divide(commonFactor); 

    return new Rational(resultNumerator, resultDenominator); 
} 

Чтобы использовать это точно, как я написал, вам нужен новый конструктор, который принимает два аргумента BigInteger; но вы, вероятно, этого хотите.

+0

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

+0

Err, вид. Это может быть проще всего увидеть на примере. Если я добавлю 1/8 + 1/12, и я использую подход в решении trogdor и решении Джима Гаррисона, я заканчиваю (1 x 12 + 1 x 8)/(8 x 12), что составляет 20/96. Это правильно, но не в простейшей форме. С моим подходом вы начинаете с поиска GCD 8 и 12 (что равно 4) и деления на все, как вы идете. Это дает 5/24, что является правильным и в простейшей форме. Разница может показаться незначительной при добавлении двух рациональных чисел, но по мере того, как вы добавляете все больше и больше чисел, знаменатели в конечном итоге увеличиваются экспоненциально. Это ... –

+0

... является особой проблемой в решении trogdor, которая использует intValue для числителя и знаменателя. Таким образом, это не удастся, например, добавить 1/17 + 1/17 + 1/17 + 1/17 + 1/17 + 1/17 + 1/17 + 1/17. Здесь вместо того, чтобы давать 8/17 в качестве ответа (что мое решение будет), решение trogdor даст вам арифметическое переполнение, потому что и числитель, и знаменатель становятся слишком большими для хранения в int. –

Смежные вопросы