PAT乙级 1013 数素数
题目
分析
- 输入m,n,然后输出第m个到第n个素数,每行输出10个数字
- 先把第1个到第n个素数求出来,然后输出第m个到第n个
- 使用数组将求出来的素数存储下来,由于n最大值为10000,所以数组大小设置为10001,防止越界
- 求出素数后再用一个for循环输出m到n的素数,注意每行输出10个,每行最后一个数字不能有空格
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int m = cin.nextInt();
int n = cin.nextInt();
int[] num = new int[10001];
num[0] = 2;
int count = 1;
for (int i = 3; i <= 110000; i += 2) {//让i小于第一万个素数
boolean flag = true;
for (int j = 0; j < count && j < Math.sqrt(i); ++j) {
if (i % num[j] == 0) {
flag = false;
break;
}
}
if (flag) {
num[count] = i; //把素数存储进数组,下标表示第几个素数
++count;
}
if (count > n) break; //第n个素数之后没必要计算,跳出循环节约时间
}
boolean flag = false;
for (int i = m - 1; i < n; i++) {//数组是从0开始的,所以从m-1开始输出,n-1结束
if ((i - m + 2) % 10 == 1) flag = false; //判断是否处于每行开头,如果是,则flag变为false
if (flag) System.out.print(" "); //在输出数字前输出空格,这样每行末尾就没有空格了
System.out.print(num[i]);
if ((i - m + 2) % 10 == 0 && (i - m) != 0) System.out.println();//判断当前行是否有10个数字,如果有则换行
flag = true;
}
cin.close();
}
}