輸入一個整數 n(2 ≤ n ≤ 10000),輸出所有大於 1 且小於 n、個位數字為 1 的質數。質數之間用空格分隔,最後一個質數後不加空格;若不存在則輸出 -1。輸入包含多組測試資料,每行一個 n,EOF 結束。
輸入: 100 輸出: 11 31 41 61 71
i % 10 == 1)。#include#include #include #define MAXN 10000 bool is_prime[MAXN + 1]; void sieve() { for (int i = 2; i <= MAXN; i++) is_prime[i] = true; for (int i = 2; i * i <= MAXN; i++) if (is_prime[i]) for (int j = i * i; j <= MAXN; j += i) is_prime[j] = false; } int main() { sieve(); int n; while (scanf("%d", &n) != EOF) { bool first = true; for (int i = 2; i < n; i++) { if (is_prime[i] && i % 10 == 1) { if (!first) printf(" "); printf("%d", i); first = false; } } if (first) printf("-1"); printf("\n"); } return 0; }
預處理 O(MAXN log log MAXN) ≈ 10⁴,每查詢 O(n),極快滿足限制。