PAT1013 数素数 Java 脱坑手记

本文记录了一道编程题——PAT1013数素数,主要讨论如何优化判断素数的函数并实现主函数逻辑,以输出指定范围内的素数。博主分享了使用ArrayList存储素数表,通过筛除法优化判断素数的过程,并给出了调整后的代码,成功解决了运行超时的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT1013 数素数 Java 脱坑手记


用了一个不知道哪里看到的知识
任何一个合数都可以由一个质数和一个数相乘得到

题目分析

通过输入的 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、主函数 逻辑块 格式排版(输出从 P​M到 P​N的所有素数,每 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!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值