[英]Java - Increasing performance of a simple prime number validator
我正在介绍Java类,刚刚完成了一项任务,但我脑子里还有一个问题。 我没有时间问我的教授,这与我们正在做的事情有点不同。
基本上我们有一个程序将验证用户输入的整数是否为素数。 如果它不是素数,它计算最小的素数小于输入。 例如:
Enter an integer: 4
4 is not a prime number. The closest prime number is 3.
如果输入不是素数,则程序使用循环按预期工作。 这是我的代码:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int number;
System.out.print("Please enter a positive, non-zero integer: ");
number = input.nextInt();
input.close();
if (isValid(number) == true) {
if(isPrime(number) == true) {
System.out.printf("%d is a prime number.", number);
} else {
switch(number) {
case 1:
System.out.print("1 is not a prime number. \n");
System.out.print("We cannot find the nearest prime.");
break;
default:
System.out.printf("%d is not a prime number.", number);
System.out.printf("\nThe nearest prime number is %d.", getNearestPrime(number));
}
}
} else {
System.out.print("Invalid input. Please run again.");
System.exit(1);
}
}
public static boolean isValid(int number) {
if (number > 0) {
return true;
} else {
return false;
}
}
public static boolean isPrime(int number) {
int i;
if(number == 1) {
return false;
} else {
for(i = 2; i < number; i++) {
if(number%i == 0) {
return false;
}
}
return true;
}
}
public static int getNearestPrime(int number) {
do {
number--;
} while (isPrime(number) == false);
return number;
}
重要的是要注意我们需要创建下面列出的三种方法main。
我的问题是: 在这种情况下计算更大的整数时有没有办法提高性能?
如果我要输入2,147,483,647,该程序大约需要10秒钟来识别它的素数。 如果我输入2,147,483,646,找到最接近的素数大致需要相同的时间。
我完全理解为什么会发生这种情况,但似乎我使用过的任何高级Java应用程序都可以比简单的程序更快地计算机。
我真的很好奇有经验的程序员如何处理这样的事情。 谢谢!
你可以改变一些简单的事情:
1)素数永远不会是偶数,所以一旦你检查一个数字是否可以被2整除,你就不需要检查它是否可以被任何其他偶数整除。 所以你可以简化一下你的循环。 (刚加入的if
检查语句,如果数字是2
,然后开始i
的三个)
2)你只需循环直到数字的平方根。
int i;
if(number == 1) {
return false;
}
if(number == 2) {
return true; //2 is a prime number
}
if (number % 2 == 0) {
return false;
}
for(i = 3; i* i <= number; i+=2) {
if(number%i == 0) {
return false;
}
}
return true;
有一点需要注意的是算法明智地使用更有效的算法。 有关详情,请参阅此答案
关于实现,您可以使用一些技巧,例如,如果您想提高性能,请缓存最近的结果。 一种更有效的方法,但也许在课程范围之外,可以使用预先计算的素数列表。 您可以在互联网上找到一个,或者您可以运行一次程序,以便将它们预先计算到给定点。
请注意,为了速度,这种方法会牺牲一些内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.