0

我在使用 BigIntegers 时遇到问题。我add在使用 Rational 类中的方法时遇到问题。在Rational(int x, int y)构造函数中,我试图通过使用该方法将参数数据类型int转换为实例变量数据类型。BigIntegertoString(int n)

  1. 我在Rational(int x, int y)构造函数中正确地进行了转换吗?
  2. 他们add编写方法的方式我在所有 n.num 和 n.den 下都出现错误。我不明白为什么我会收到这个错误。我没有正确使用addBigInteger 类中的方法吗? 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;
}
4

4 回答 4

4

要将 int 转换为 BigInteger,我会使用BigInteger.valueOf(int).

此外,您不能将运算符与 BigInteger 一起使用,您必须使用它自己的方法。你的方法应该是这样的:

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());
}
于 2013-08-28T02:10:00.297 回答
3

1) 我是否在 Rational(int x, int y) 构造函数中正确地进行了转换?

您可以使用

BigInteger num = BigInteger.valueOf(x);

不需要先创建字符串。

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

您的 add 方法是错误的,并且不清楚您要在 add 方法中实现什么。但是如果你想在 BigInteger 中做加法,你应该使用BigInteger#add方法,而对于 BigInteger 之间的乘法,你应该使用BigInteger#multiply方法。

于 2013-08-28T02:06:24.703 回答
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

于 2013-08-28T02:06:17.800 回答
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参数的新构造函数;但你可能还是想要那个。

于 2013-08-28T02:40:14.393 回答