1013 数素数 (20 分)
令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 PM 到 PN 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
思路:这个题要求输出第M到N个素数,很多人第一反应是把0-N之间所有素数存到数组再输出,我试了多种求素数方式都会存在运行超时情况。
其实不用把M-N之外的素数也存起来, 在判定的时候加个计数器 如果是处于M到N之间的素数就存起来,这样会节省不少时间。
注意:有个罗列素数的算法叫素数筛法,理论时间复杂度为线性,实际上数组一大就很难用(超过1e5);
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static boolean isPrime(int x){
if(x < 2){
return false;
}
double bound = Math.sqrt(x);
for(int i = 2; i <= bound; ++i){
if(x % i == 0){
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int N = sc.nextInt();
int MAXN = 104729;
int index = 0;
ArrayList<Integer> prime = new ArrayList<>();
for(int i = 2 ;; ++i){
if(isPrime(i)){
index++;
if(index >= M && index <= N){
prime.add(i);
}
}
if(index == N){
break;
}
}
int count = 1;
for(int i = 0; i < prime.size(); ++i){
if( count % 10 != 0 && i != N-M ){
System.out.print(prime.get(i)+" ");
}else {
System.out.println(prime.get(i));
}
count++;
}
}
}