用了一个不知道哪里看到的知识
任何一个合数都可以由一个质数和一个数相乘得到
题目分析
通过输入的 M和N,进行计算输出 所有素数中,从第M到第N个素数,并要求:
每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格,输出。
判断素数函数
1、任何一个合数都可以表示成一个质数和一个数的乘积
/*进行判断素数优化 (任何一个合数都可以由一个质数和一个数相乘得到)
记录素数表,通过 除以比自身小的素数判断i是否为素数
通过ints记录下素数,对每一个数对素数表求余判断
并通过 sqrt() 筛去部分素数 减少运算
*/
public static Boolean isPrime(int number, ArrayList<Integer> ints) {
int temp = (int) Math.sqrt(number);
for (int i = 0; i < ints.size(); i++) {
if (ints.get(i) <= temp) {
if (number % ints.get(i) == 0) {
return false;
}
}else {
return true;
}
}
return true;
}
2、主函数 逻辑块 格式排版(输出从 PM到 PN的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格)
ArrayList 已经记录下素数表,可以单独进行格式化输出。(本人一开始是直接计算输出,运行超时,这里修改了函数后,PTA通过)
import java.util.ArrayList;
import java.util.Scanner;
/**
* @ClassName $1013PrimeScreening
* @Description: https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112
* 查找第 M到 第N个素数
* @Author: zyb
* @Date: 2021-01-08
* @Version:v1.0
*/
public class $1013Prime {
public static Scanner input;
public static void main(String[] args) {
input = new Scanner(System.in);
int M = input.nextInt(); // 获取M
int N = input.nextInt(); // 获取N
int i = 2;
ArrayList<Integer> ints = new ArrayList();
ints.add(2);
/* 通过Arraylist的size 自动得到长度 ,并进行计算出素数位次 与M N 进行比较输出 通过 */
while (ints.size() < N) {
if (isPrime(i,ints)) {
ints.add(i); //添加到素数表中
if (M <= ints.size() && ints.size() <= N) { //从 M 到 N
if ((ints.size() - M + 1 ) % 10 == 0) { //每十个素数进行换行(通过 ints.size() - M + 1
// 解决 开头 第M个素数 直接换行)
if (ints.size() == N)
System.out.print(i); //若第N个为10的倍数 不进行换行
else
System.out.println(i);
} else if (ints.size() == N) //第N个素数输出不添加空格
System.out.print(i);
else
System.out.print(i + " ");
}
}
i++;
}
}
over!