我正在尝试验证输入的BigInteger数字是否为素数!
但是,对于13,31这样的较小的数字,它运行得很好,但是在15的情况下,它会产生错误,方法是将它声明为。我无法找出这个错误,可能它隐藏在涉及binary-search!的squareroot()方法方法中。
请查看代码,并帮助我指出错误!
调用代码:-
boolean p=prime(BigInteger.valueOf(15));
System.out.println("P="+p);调用代码:-
public static boolean prime(BigInteger bi2){
if(bi2.equals(BigInteger.valueOf(2)) || bi2.equals(BigInteger.valueOf(3)))
{
return true;
}
BigInteger bi,bin;
bin=squareroot(bi2);
for(bi=BigInteger.valueOf(2);bi.compareTo(bin)<=0;bi=bi.add(ONE)){
if(bi2.mod(bi).equals(ZERO))
return false;
else continue;
}
return true;
}
public static BigInteger squareroot(BigInteger bi){
BigInteger low,high,mid=ZERO,two;
low=ONE;
high=bi;
two=BigInteger.valueOf(2);
while(low.compareTo(high)<0)
{
mid =(BigInteger)(low.add(high)).divide(two);
//System.out.println("Low-Mid-High="+low+" "+mid+" "+high);
if(mid.multiply(mid).compareTo(bi)==0)
return mid;
if(mid.multiply(mid).compareTo(bi)>0)
high = mid.subtract(ONE);
else if(mid.multiply(mid).compareTo(bi)<0)
low = mid.add(ONE);
}
return mid;
}发布于 2014-05-27 07:04:00
您的问题是,您从squareroot返回squareroot,而不将其重新评估为(low + high) / 2。这导致它返回算法上一次迭代的中点;这几乎总是错误的。
这样做的效果是,你有时会错过一些主要因素。在15的情况下,因为squareroot返回2,所以忽略了查找3作为一个主要因素。在13和31的情况下,没有主要的因素让你错过,所以你得到了正确的结果。
https://stackoverflow.com/questions/23882873
复制相似问题