当前位置: 代码迷 >> 综合 >> PAT乙级——1013(素数操作)
  详细解决方案

PAT乙级——1013(素数操作)

热度:40   发布时间:2023-12-13 06:37:02.0

题目:数素数 (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

代码实现

一开始有一个情况没有考虑到,十九分

import java.util.Scanner;public class Main {
     public static void main(String []args){
     Scanner in = new Scanner(System.in);int head =in.nextInt();int bottom =in.nextInt();int temp[]=new int[1000];int k=0;int count=0;//素数定义从2开始计算for(int i=2;;i++){
     if(isPrime_3(i)==1){
     count++;if(count>=head&&count<=bottom){
     temp[k]=i;k++;}else if(count>bottom)break;}}int j=1;for(int i=0;i<k;i++){
     if(j!=10){
     if (j!=1)System.out.print(" ");System.out.print(temp[i]);j++;}else {
     System.out.println(" "+temp[i]);j=1;}}}//判断是不是素数static int isPrime_3(int num){
     //两个较小数另外处理if(num ==2|| num==3 )return 1 ;//不在6的倍数两侧的一定不是质数if(num %6!= 1&&num %6!= 5)return 0 ;double tmp =Math.sqrt(num);//在6的倍数两侧的也可能不是质数for(int i= 5;i <=tmp; i+=6 )if(num %i== 0||num %(i+ 2)==0 )return 0 ;//排除所有,剩余的是质数return 1 ;} } 

找了好久,调整输入数据的长度,当是10的时候,发现输出多空了一行
在这里插入图片描述

在这里插入图片描述
对比会发现退出标志前面多空了一行,问题定位到当最后一行是完整的10个数时,不能执行换行操作。
在这里插入图片描述

import java.util.Scanner;public class Main {
     public static void main(String []args){
     Scanner in = new Scanner(System.in);int head =in.nextInt();int bottom =in.nextInt();int temp[]=new int[1000];int k=0;int count=0;//素数定义从2开始计算for(int i=2;;i++){
     if(isPrime_3(i)==1){
     count++;if(count>=head&&count<=bottom){
     temp[k]=i;k++;}else if(count>bottom)break;}}int j=1;for(int i=0;i<k;i++){
     if(j!=10){
     if (j!=1)System.out.print(" ");System.out.print(temp[i]);j++;//当收尾相遇时既不用换行}else if(j==10&&bottom==head)System.out.print(" "+temp[i]);else {
     System.out.println(" "+temp[i]);j=1;}head++;}}//判断是不是素数static int isPrime_3(int num){
     //两个较小数另外处理if(num ==2|| num==3 )return 1 ;//不在6的倍数两侧的一定不是质数if(num %6!= 1&&num %6!= 5)return 0 ;double tmp =Math.sqrt(num);//在6的倍数两侧的也可能不是质数for(int i= 5;i <=tmp; i+=6 )if(num %i== 0||num %(i+ 2)==0 )return 0 ;//排除所有,剩余的是质数return 1 ;} } 

在这里插入图片描述
emmmmmmm,不过呢存在一个运行超时的问题,我运行了三次,两次超时18分,一次AC。提交不成功可以多提交两下试试。亲测对java没有那么友好。