BigInteger从int转换为BigInteger

时间:2013-08-28 02:02:33

标签: java biginteger

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

  1. 我是否在Rational(int x, int y)构造函数中正确进行了转换?
  2. 他们编写add方法的方式我在n.num和n.den下都遇到了错误。我不明白为什么我会收到这个错误。我没有正确使用BigInteger类中的add方法吗? http://docs.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html

  3. 假设一个类具有以下

    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 个答案:

答案 0 :(得分:4)

要将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());
}

答案 1 :(得分: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

答案 2 :(得分:2)

  

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

您可以使用

BigInteger num = BigInteger.valueOf(x);

不需要首先创建字符串。

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

您的添加方法错误,并且不清楚您在添加方法中尝试实现的目标。但是如果你想在BigInteger中做加法,你应该使用BigInteger#add方法,并且要在BigInteger之间进行乘法,你应该使用BigInteger#multiply方法。

答案 3 :(得分: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参数的新构造函数;但无论如何你可能都想要这样。