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)\)。