【发布时间】:2017-12-17 23:00:53
【问题描述】:
我想编写一个 java 程序来检查素数是否有大值。我已经编写了这段代码,但是我的代码中有错误。请帮助我解决这个问题,以便它适用于大值。
另外,我的方法是否适合在没有内置函数的情况下检查大数的素数?
请提供其他可能的解决方案/方法。
我的代码:
import java.math.*;
import java.util.Scanner;
public class CheckPrimeNumber {
public static void main(String[] args)
{
int flag=0;
BigInteger input;
try{
Scanner sc= new Scanner(System.in);
System.out.println("Enter a valid positive number: ");
String strinput=sc.nextLine();
input = new BigInteger(strinput);
sc.close();
if(input.equals(0) ||input.equals(1)){
System.out.println(input+" is not a prime number.");
}
else{
for(BigInteger i=2; i < input.divide(2); i++){
if(input.remainder(2) == 0){
System.out.println(input+" is not a prime number.");
flag=1;
break;
}
}
if(flag==0)
System.out.println(input +" is a prime number.");
}
}
catch(Exception e){
System.out.println("Please enter only valid positive number: ");
}
finally{
System.out.println("Thank you...!!!");
}
}
}
【问题讨论】:
-
对于大数,使用这样的想法:给定 n,n 是素数,当且仅当它不能被 0 到 sqrt(n) 范围内的任何素数整除时
-
试除法可能太慢而无法确定大整数的素数。 Miller-Rabin 算法是适合这种情况的一个很好的算法,您可以在 Google 的帮助下或通过查看 my blog 找到它。
-
您能否发布您在问题中遇到的确切错误?
-
首先,您应该发布您的错误。您的方法应该是检查 input/2 数字以查看它们是否可以被某些数字整除。这是正确的,但它不是最好的。检查其他主要算法以获得更好的性能。在 for 循环中,您应该检查 input.remainder(i) 而不是 input.remainder(2)。
-
您正在使用 .equals 来比较 BigInteger 和一个 int,它总是评估为 false,您使用 compareTo 比较两个 BigInteger 值,也让您的问题更清楚。 “我想编写一个 java 程序来检查大值的素数。” ??????