素数打表
题目描述:求第n个素数(1 <= n <= 10000)
1、方式1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
boolean[] visited = new boolean[1000000];
int n = 200000; //足够产生10000个素数
int[] prime = new int[n];
int num = 0;
for(int i = 2; i < n; i++) {
if(!visited[i]) {
prime[num++] = i;
}
for(int j = i; j <= n; j += i) {
visited[j] = true;
}
}
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int k = sc.nextInt();
System.out.println(prime[k-1]);
}
sc.close();
}
}
2、方式2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
boolean[] visited = new boolean[1000000];
int n = 200000; //足够产生10000个素数
int[] prime = new int[n];
int num = 0;
for(int i = 2; i < n; i++) {
if(!visited[i]) {
prime[num++] = i;
}
// ----------注意这里发生改变---------------
for(int j = 0; j < num && i * prime[j] < n; j++) {
visited[i * prime[j]] = true;
/*
* 此处是重点,避免了很多的重复判断,
* 比如i=9,现在素数是2,3,5,7,进入二重循环,
* visit[2*9]=1;visit[3*9]=1;这个时候9%3==0,要跳出。
* 因为5*9可以用3*15来代替,如果这个时候计算了,
* i=15的时候又会被重复计算一次,所以这里大量避免了重复运算。
* 参考自:http://blog.youkuaiyun.com/u011560507/article/details/10032607
*/
if(i % prime[j] == 0) break;
}
}
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int k = sc.nextInt();
System.out.println(prime[k-1]);
}
sc.close();
}
}