import java.util.*;
public class PrimeNum {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a = input.nextInt();
int b = input.nextInt();
for(int i = a ; i <= b ; i++ ) {
if ( i == 2 || i == 3 ) System.out.println(i);
for(int j = 2; j <= (i / 2) ; j++ ) {
if ( (i % j) == 0 ) break;
if ( j == (i / 2) ) System.out.println(i);
}
}
}
}
这个程序很简单,输入2 int a和b。它会在a和b中找到任何素数。
我怎样才能让它更快?我尝试了Math.sqrt,但在这种情况下效果不好:(我真的不知道,因为每当我使用它时,它会导致很多错误。我希望看到有人在这种情况下使用Squareroot。
答案 0 :(得分:2)
我同意使用不同方法的建议,但我会尝试解释为什么你的方法不起作用。
我认为问题在于您打印结果的方式:
for(int j = 2; j <= (i / 2) ; j++ ) {
if ( (i % j) == 0 ) break;
if ( j == (i / 2) ) System.out.println(i);
}
这适用于i / 2
,但Math.sqrt(i)
会失败,因为它并不总是整数,然后j == Math.sqrt(i)
永远不会成立。只有i
是精确的方格时,您的代码才有效。
最好重构你的代码,以便你的素数测试采用单独的方法:
boolean isPrime(int i) {
int s = (int)Math.sqrt(i);
for (int j = 2; j <= s; j++) {
if (i % j == 0) { return false; }
}
return true;
}
答案 1 :(得分:0)
您可以使用此http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes算法。它的实施快速而简单。它不完全相同,因为您无法为该算法定义下限(a),但是在找到从2到b的所有元素后,您可以只返回a和b之间的数字。
答案 2 :(得分:0)
如何只检查奇数,因为偶数很少是素数......
if(a==2) System.out.println(2);
if((a%2)==0) a++;
for(int i = a ; i <= b ; i+=2 ) {
if(i == 3 ) System.out.println(i);
int root = (int) Math.sqrt(i);
for(int j = 2; j <= root ; j+=2 ) {
if ( (i % j) == 0 ) break;
if ( j == root ) System.out.println(i);
}
}