我实现了自己的Class Fraction,我有一个BigInteger分子对象和BigInteger分母对象。每当我调用Fraction对象的构造函数时,它都会从参数中解析分子和分母并简化分数。我遇到的问题是,当我为大数字调用gcd(biginteger分子,biginteger分母)时,我得到了堆栈溢出异常。我希望能够得到真正大的BigInteger对象的gcd。
private BigInteger gcd(BigInteger a, BigInteger b)
{
if(a.mod(b).toString().equals("0"))
return b;
return gcd(b, a.mod(b));
}
我得到的错误是:
Exception in thread "main" java.lang.StackOverflowError
at java.math.MutableBigInteger.divideKnuth(MutableBigInteger.java:1203)
at java.math.MutableBigInteger.divideKnuth(MutableBigInteger.java:1163)
at java.math.BigInteger.remainderKnuth(BigInteger.java:2167)
at java.math.BigInteger.remainder(BigInteger.java:2155)
at java.math.BigInteger.mod(BigInteger.java:2460)
at Fraction.Fraction.gcd(Fraction.java:69)
at Fraction.Fraction.gcd(Fraction.java:71)
at Fraction.Fraction.gcd(Fraction.java:71)
at Fraction.Fraction.gcd(Fraction.java:71)
还有很多Fraction.Fraction.gcd(Fraction.java:71)。
答案 0 :(得分:1)
问题是您错误地编码了Euclid's algorithm。算法是这样的:
gcd(a, 0) = a
gcd(a, b) = gcd(b, a mod b)
这不是你的代码所做的。
// This is supposed to implement the first term ... but it doesn't
if (a.mod(b).toString().equals("0"))
return b;
@clemens和@EJP的上述评论是适用的。
@AlexF的评论只与极大数字有关。欧几里得的算法迅速收敛。 (有关血腥的详细信息,请参阅https://math2.uncc.edu/~frothe/Euclidextendpnew.pdf。)