1013 数素数 (20 分)
令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤10^4,请输出 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
解题思路:
- 从 prime = 2开始依次判断prime是否为素数,如果prime是素数且计数器count在M和N之间,则调用打印方法printPrime,如果count > N 跳出while循环
- 判断一个数是否为素数的方法,如果用一般方法会有一个测试点运行超时。判断素数方法采用这篇博文所介绍方法
Java代码实现:
import java.util.Scanner;
public class PrimeNumber2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int N = sc.nextInt();
int prime = 2;//素数大于1的自然数,所以从2开始找素数
int count = 0; //计数器
int i = 0;
while(true){
if(isPrimeNumber(prime)){
count++;
//如果prime是素数且在第M和第N个之间则打印
if (count>=M && count<=N) {
i++;
printPrime(prime,i,(N-M+1));
}else if (count>N){
break;
}
}
prime++;//遍历所有正整数找素数
}
}
//判断是否为素数的高效方法
private static boolean isPrimeNumber(int num) {
//两个较小数另外处理
if(num ==2|| num==3 )
return true ;
//不在6的倍数两侧的一定不是质数
if(num %6!= 1&&num %6!= 5)
return false ;
double tmp =Math.sqrt( num);
//在6的倍数两侧的也可能不是质数
for(int i= 5;i <=tmp; i+=6 )
if(num %i== 0||num %(i+ 2)==0 )
return false ;
//排除所有,剩余的是质数
return true ;
}
//判断是否为素数:运行超时(有一个测试用例过不了)
/*public static boolean isPrimeNumber(double i){
for (int j = 2; j <= Math.sqrt(i); j++) {
if(i%j == 0){
return false;
}
}
return true;
}*/
//打印素数方法
private static void printPrime(int prime, int i, int count) {
if(i%10 == 0){//每一行的最后一个素数,需要换行且没有空格
System.out.println(prime);
}else if (i==count){//表示最后一个需要打印的素数,没有空格
System.out.print(prime);
}else {//其他情况
System.out.print(prime + " ");
}
}
}