給定 N, C,輸出 N 以內(含 N)素數的中間 2*C-1(素數個數為奇)或 2*C(偶)個素數。N ≤ 1000,多測試用例。
isprime[] 標記,prime[] 存儲素數列表,nprime 計數。nprime < 2*C:輸出所有素數。2*C-1 個,索引 [(nprime-(2*C-1))/2, (nprime+(2*C-1))/2)。2*C 個,索引 [(nprime-2*C)/2, (nprime+2*C)/2)。N C: p1 p2 ... 雙換行分隔用例。void doprime(int n) {
nprime = 1; prime[0] = 1;
memset(isprime, true, sizeof(isprime));
isprime[1] = false;
for (int i = 2; i <= n; i++) if (isprime[i]) {
prime[nprime++] = i;
for (int j = i*i; j <= n; j += i) isprime[j] = false;
}
}
int main() {
while (cin >> n >> c) {
doprime(n);
// 邊界判斷與輸出...
}
}
prime[0]=1, nprime=1 起始。本題考察基礎篩法與邊界條件處理,代碼短小但細節決定成敗。