1. 程式人生 > >牛客網 PAT 算法歷年真題 1003: 數素數 (20)

牛客網 PAT 算法歷年真題 1003: 數素數 (20)

長度 ear code span 數字 print pan += and

1003:數素數 (20)

時間限制 1000 ms 內存限制 32768 KB 代碼長度限制 100 KB 判斷程序 Standard (來自 小小)

題目描述

令Pi表示第i個素數。現任給兩個正整數M <= N <= 10000,請輸出PM到PN的所有素數。

輸入描述:

輸入在一行中給出M和N,其間以空格分隔。


輸出描述:

輸出從PM到PN的所有素數,每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


思路分析:

這個題,判斷素數大家都會,重點是在於這個算法是否會超時,以及輸出格式的問題:

素數判斷:

除了1和它本身,沒有其他的因子,稱為素數, 可以看成 循環變量從2到n-1,但是,如果數非常大的話,這就很頭疼了,
咱們來簡化一下判斷素數的方法,比如n=9時,因為9開根等於3,所以,判斷到3就可以確定9不是素數,因此,循環變量i可以從2到根號下n,也就是【2-sqrt(n)】
當一個數被確認是素數時,就要輸出了,

輸出格式:

題目要求,10個一換行
那麽咱就直接判斷count(從2開始累加的素數的個數),分為3種情況:

1.素數的位置小於題目要求的輸出範圍,即count<n,這時候,不輸出,繼續循環;
2.素數的位置在題目要求的輸出範圍,首先行內輸出素數,這時,素數後面的輸出,又分為3種情況:
  ①輸出的素數不是一行的第10個,即(count-m+1)%10!=0,
   例如題目給的測試用例,m=5,當count=5時,(count-m+1)%10=1,當count=13時,(count-m+1)%10=9,
   這個時候需要輸出一個空格“ ”;
  ②輸出的素數恰巧是一行的第10個,即(count-m+1)%10=0,
   例如,當count=14時,(count-m+1)%10 = 0 ,這個時候需要輸出一個空行;
  ③數出的素數是要求輸出的最後一個,即count=n,這個時候,直接結束程序即可;

3.素數的位置大於題目要求的輸出範圍,其實,程序永遠都走不到這一步,當輸出的素數是要求輸出的最後一個時,在第二種情況的第三點已經結束程序啦

Java 代碼如下:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sca 
= new Scanner(System.in); int m = sca.nextInt(); int n = sca.nextInt(); int count = 1; if(m == 1) { System.out.print(2); if(n == 1) return; else System.out.print(" "); } int i = 3; while(true){ if(f(i)) { //素數判斷 count++; //素數數目+1 if(count >= m) { //素數的位置在題目要求的輸出範圍 System.out.print(i);// 行內輸出素數 if(count==n){//數出的素數是要求輸出的最後一個,結束程序 return; } if((count-m+1) % 10 != 0) {//①(count-m+1)%10!=0,輸出空格“ ” System.out.print(" "); }else { //①(count-m+1)%10==0,輸出空行 System.out.println(); } } } i+=2; } } //判斷素數 static boolean f(int x){ for(int j = 2; j < Math.sqrt(x) + 1; j++) { if(x % j == 0) { return false; } } return true; } }

 

牛客網 PAT 算法歷年真題 1003: 數素數 (20)