C++ / ACM 自学笔记 · v5.0

P5723 质数口袋

原题入口

对应章节:一、C++ 语法基础 → (五) 条件与循环。

(一) 任务与输出目标

从 2 开始依次放入质数,累计重量不超过 L;输出放入的质数及个数。

(二) 建模与推导

枚举当前整数 x,试除 2 到平方根判断它是不是质数。发现质数后先检查新总和:装得下就累加、输出并计数;装不下时后面的质数更大,继续尝试也无法按顺序装入,循环结束。

(三) 手算与过程

L=10:装入 2、3、5,总和为 10;下一个质数 7 装不下,最后输出个数 3。

(四) 带注释实现

完整源文件

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

void solve() {
    int limit, sum = 0, count = 0;
    cin >> limit;
    for (int x = 2; x <= limit; ++x) {
        bool prime = true;
        for (int d = 2; d * d <= x; ++d)
            if (x % d == 0) {
                prime = false;
                break;
            } // 找到一个真因子即可结束判断。
        if (!prime)
            continue;
        if (sum + x > limit)
            break; // 按顺序放入,下一个质数只会更重。
        sum += x;
        ++count;
        cout << x << '\n';
    }
    cout << count << '\n';
}

signed main() {
    ios::sync_with_stdio(false); // 关闭同步,使用 cin 与 cout 完成输入输出。
    cin.tie(0), cout.tie(0);

    int T = 1; // 本题读入一组数据。
    // cin >> T; // 题目给出测试组数时开启,并在 solve 中处理一组。
    while (T--)
        solve();
}

(五) 复杂度

用枚举上界估算,时间 \(O(L\sqrt L)\);实际在累计和达到承重量时提前结束。额外空间 \(O(1)\)。

返回本章题解索引 · 返回全部题号索引

查阅笔记正文与全部题解 · Ctrl / ⌘ K