【題解】c033: 00406 – Prime Cuts

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=c033
【解題想法】質數篩法

  • 先利用質數篩法建立指數表,把所有範圍內的質數依序存在 v。
  • 每次讀入一個 N,即可利用二分搜(lower_bound)快速找出符合條件的質數個數 K。
  • 再依照指定格式印出。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1005;
int prime[maxn]; // 0:prime
vector <int> v;

int main() {
    int N, C, K, p;
    // 建立質數表
    prime[0] = 1;
    p = 2;
    v.push_back(1);
    while (p <= maxn){
        if (!prime[p]) {
            v.push_back(p);
            for (int i=2*p; i<maxn; i+=p)
                prime[i] = 1;
        }
        p++;
    }
    while (cin >> N >> C){
    	auto it = lower_bound(v.begin(), v.end(), N);
    	K = (int)(it - v.begin());
    	if (*it == N) {
    		K++;
    	}
        cout << N << ' ' << C << ":";
        for (int i=max(0, K/2 - C + (K % 2)); i<min(K, K/2+C); i++){
            cout << ' ' << v[i];
        }
        cout << '\n';
    }
    return 0;
}
分享本文 Share with friends