我有两种使用long
的方法,我想使用BigInteger:
public static long findfirstnocommon(long n) {
long j;
for(j = 2; j < n; j++)
if(euclid(n,j) == 1) return j;
return 0;
}
public static long euclid(long m, long n) {
while(m > 0) {
long t = m;
m = n % m;
n = t;
}
return n;
}
这两种方法在我的程序中非常有效。但是,当我将它们翻译成BigIntegers时,我得到了这个:
public static BigInteger findfirstnocommon(BigInteger n) {
BigInteger j;
for(j = BigInteger.valueOf(2); j.compareTo(n) == -1; j.add(BigInteger.valueOf(1))){
if(euclid(n,j).compareTo(BigInteger.valueOf(1)) == 0){
return j;
}
}
return BigInteger.valueOf(0);
}
public static BigInteger euclid(BigInteger m, BigInteger n) {
BigInteger zero = BigInteger.valueOf(0);
while(m.compareTo(zero) == 1) {
BigInteger t = m;
m = n.mod(m);
n = t;
}
return n;
}
当我使用它们的方法并在我的程序中运行它时,它似乎卡住而不起作用。我一直在试图看出哪些是错的,无法弄明白。有什么建议?谢谢。
答案 0 :(得分:1)
j.add(BigInteger.valueOf(1))
不会更改j
。它会返回新 BigInteger
,其价值超过j
,但您要丢弃它。请尝试j = j.add(BigInteger.ONE)
[此常量为您提供,因此您无需键入valueOf(1)
]。
实际上,BigInteger
(如String
)是 immutable 类型,这意味着没有方法可以更改BigInteger
对象的内容,只返回新BigInteger
个对象的方法。