牛客網 PAT 算法歷年真題 1003: 數素數 (20)
阿新 • • 發佈:2019-01-23
長度 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)