1. 程式人生 > >PAT B1013 數素數 (20 分)

PAT B1013 數素數 (20 分)

一行 name span scrip size ng- -i 兩個 int

P?i?? 表示第 i 個素數。現任給兩個正整數 MN10?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
#include <stdio.h>
#include <algorithm>
#include 
<cstring> using namespace std; const int maxn = 1000001; int pnum = 0, prime[maxn]; bool p[maxn] = { false }; void find_prime(int n) { for (int i = 2; i <maxn; i++) { if (p[i] == false) { prime[pnum++] = i; if (pnum == n)break; for (int j = i + i; j < maxn; j += i) { p[j]
= true; } } } } int main(){ int m, n; scanf("%d%d", &m,&n); find_prime(n); int count = 0; for (int i = m - 1; i < n; i++) { printf("%d", prime[i]); count++; if (count % 10 != 0 && i < n - 1) printf(" "); else
printf("\n"); } system("pause"); return 0; }

註意點:找第幾個到第幾個素數之間的所有素數,肯定是要先把所有素數找出來的,或者就是一個個找,找一個加一個。在這裏用了一個很巧妙的辦法,從2開始遍歷,先所有都認為是素數,然後從小的開始,把是這個小數的倍數全設置成非素數,但與直接一個個數遍歷耗內存,時間也差不多

PAT B1013 數素數 (20 分)