题目描述
小 A 有一个质数口袋,里面可以装各个质数。他从 2 2 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。
口袋的负载量就是口袋里的所有数字之和。
但是口袋的承重量有限,装的质数的和不能超过 L L L。给出 L L L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。
输入格式
一行一个正整数 L L L。
输出格式
将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
样例输入 1
100
样例输出 1
2
3
5
7
11
13
17
19
23
9
样例输入 2
5
样例输出 2
2
3
2
样例输入 3
11
样例输出 3
2
3
5
3
提示
数据保证, 1 ≤ L ≤ 10 5 1 \le L \le {10}^5 1≤L≤105。
关于质数,请参考我的另一篇文章:专题一:质数。
参考代码1:使用数组
#include<iostream>
using namespace std;
bool a[100000]; //用于标记质数:true-是,false-不是
//判断一个数字x是不是质数:一般解法
bool isPrime(int x) {
bool f = true;
for (int j = 2; j * j <= x; j++) {
if (x % j == 0) { //发现x有因子,说明x不是质数
f = false;
break;
}
}
return f;
}
int main() {
int L;
cin >> L;
//i-用于遍历整数,s-用于累计质数的和
int i = 1, s = 0;
while (s <= L) {
i++;
//如果是质数
if (isPrime(i)) {
s += i; //累加和
if (s <= L) //满足条件的质数才标记
a[i] = true; //标记质数
}
}
//输出所有的质数和质数个数
int tot = 0; //tot-用于统计质数的个数
for (int j = 1; j <= i; j++)
if (a[j]) { //如果a[j]被标记,说明j是质数
cout << j << endl;
tot++;
}
cout << tot;
return 0;
}
参考代码2:不用数组
#include<bits/stdc++.h>
using namespace std;
//判断一个数字x是不是质数
bool isPrime(int x) {
bool f = true;
for (int j = 2; j * j <= x; j++) {
if (x % j == 0) { //发现x有因子,说明x不是质数
f = false;
break;
}
}
return f;
}
int main() {
int L;
cin >> L;
//i-用于遍历整数,s-用于累计质数的和,cnt-用于统计质数的个数
int i = 1, s = 0, cnt = 0;
while (s <= L) {
i++;
//如果是质数
if (isPrime(i)) {
s += i; //累加和
if (s <= L) { //满足条件的质数才输出,并计数
cout << i << endl;
cnt++;
}
}
}
cout << cnt;
return 0;
}