PAT B1013 數素數 (20 分)
阿新 • • 發佈:2019-02-10
一行 name span scrip size ng- -i 兩個 int
令 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
#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(" "); elseprintf("\n"); } system("pause"); return 0; }
註意點:找第幾個到第幾個素數之間的所有素數,肯定是要先把所有素數找出來的,或者就是一個個找,找一個加一個。在這裏用了一個很巧妙的辦法,從2開始遍歷,先所有都認為是素數,然後從小的開始,把是這個小數的倍數全設置成非素數,但與直接一個個數遍歷耗內存,時間也差不多
PAT B1013 數素數 (20 分)