题解 P5723 【【深基4.例13】质数口袋】

· · 题解

一道练习筛质数的练手题。

请先AC此题。

网上有很多关于筛素数的帖子、博文,可以自学一下。

思路:暴力枚举1-n的所有素数,如果当前i是素数并且sum+i≤n,则sum+=i,输出ix+1。否则,就输出x

```cpp #include<bits/stdc++.h> using namespace std; int n,x; long long sum=0; int pd(int y) { for(int i=2; i*i<=y; ++i) { if(y%i==0) return 0; } return 1; } int main() { scanf("%d",&n); for(int i=2; i<=n; ++i) { if(i%2==0&&i!=2) continue; if(sum+i>n) { printf("%d\n",x); return 0; } if(pd(i)) { printf("%d\n",i); sum+=i; x++; } } return 0; } ``` 感谢[洛谷万岁](https://www.luogu.com.cn/user/95333)和[死神审判](https://www.luogu.com.cn/user/242984)指正蒟蒻的错误~ 错因分析:上述代码$for$循环中,$i$最小为$2$。但是题目里没有保证$n≥2$,所以,当$n≤2$时会出现错误。 解决方法:加两个特判。 $AC$ $Code$: ```cpp #include<bits/stdc++.h> using namespace std; int n,x; long long sum=0; int pd(int y) { for(int i=2; i*i<=y; ++i) { if(y%i==0) return 0; } return 1; } int main() { scanf("%d",&n); if(n<2) { printf("0\n"); return 0; } else if(n==2) { printf("2\n1\n"); return 0; } for(int i=2; i<=n; ++i) { if(i%2==0&&i!=2) continue; if(sum+i>n) { printf("%d\n",x); return 0; } if(pd(i)) { printf("%d\n",i); sum+=i; x++; } } return 0; } ```