1013 数素数 (20)(20 分)
令P~i~表示第i个素数。现任给两个正整数M <= N <= 10^4^,请输出P~M~到P~N~的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从P~M~到P~N~的所有素数,每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
需要注意的问题:第10000个质数非常有可能已经超过了int的界限,所以我们要使用long类型的变量来存储质数
这回我觉得先上处理流程比较好:
public static void main() throws IOException {
int[] range = getData();//获取范围
long lastPrime = 1;
int count = 0;
for (int i = 1 ; i < range[0] ; i ++) {//从1开始到下界之前的一个质数
lastPrime = getPrimeBase(lastPrime);
}
for (int i = range[0] ; i < range[1]; i ++) {//从下界开始到上界的前一个质数
print((lastPrime = getPrimeBase(lastPrime)), (++count) % 10);
}
System.out.print(getPrimeBase(lastPrime));//输出最后一个
}
getData():用于获取下界和上界
public static int[] getData() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String[] targetString = bufferedReader.readLine().split(" +");
int[] range = new int[2];
range[0] = Integer.parseInt(targetString[0]);
range[1] = Integer.parseInt(targetString[1]);
return range;
}
getPrimeBase(int):返回基于参数的下一个质数
public static long getPrimeBase(long i) {
boolean flag;
if (i == 1)//否则后面会直接跳转到三
return 2;
i = i % 2 ==0 ? i + 1 : i + 2;//质数除了2,都是偶数
for (long result = i; true ; result += 2) {//这里+2是和之前一个道理
flag = true;
for (int judge = 2 ; judge * judge <= result ; judge ++) {
if (result % judge == 0){
flag = false;
break;
}
}
if (flag)
return result;
}
}
print(int, int)按照相应的格式输出
public static void print(long lastPrime, int count) {
switch (count) {
case 0:
System.out.print(lastPrime);
System.out.println();
break;
default:
System.out.print(lastPrime + " ");
break;
}
}