Java Prime Number需要更快

时间:2012-08-18 08:14:32

标签: java

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。

3 个答案:

答案 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);
  }
}