当前位置:   article > 正文

【洛谷】P5723 【深基4.例13】质数口袋_洛谷 p5723

洛谷 p5723

题目来源

P5723 【深基4.例13】质数口袋 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

小 A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。

口袋的负载量就是口袋里的所有数字之和。

但是口袋的承重量有限,装的质数的和不能超过 L。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。

输入格式

一行一个正整数 L。

输出格式

将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。

说明/提示

1≤L≤10^5.

分析&思路

这道题并不是很难。首先,我们需要定义几个变量,然后用一个for循环来遍历。个人认为,本题唯一的难点在于如何判断质数。我的思路是先写一个循环,让他循环10^5(10万)次,在循环里先判断这个数加上下一个数是不是大于这个L,如果不是,再执行。然后再定义一个布尔类型的变量来进行判断。里面再套一个循环,从2开始,如果自己乘自己不大于这个数,就进行判断:如果外层循环的数模(%)自己等于0,那么说明这个数有因数,将布尔变量改为false,如果不是,再次进行循环,直到退出循环。如果直到退出循环这个数依然为true,即为质数,输出,并将答案的个数++。思路捋清了,就开始写吧。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;//定义,l为总体,ans为答案(即个数),sum为计数器
  4. int main()
  5. {
  6. cin>>l;//先输入范围
  7. return 0;
  8. }

然后来执行循环,循环10万次,并加上判断。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;//定义,l为总体,ans为答案(即个数),sum为计数器
  4. int main()
  5. {
  6. cin>>l;//先输入范围
  7. for(int i=2;i<=10000;i++)//循环十万次(为什么从2开始?因为2是最小的质数)
  8. {
  9. if(sum+i<=l)//如果计数器加上下一个数不超出l这个范围,执行接下来的语句
  10. {
  11. }
  12. }
  13. return 0;
  14. }

接下来定义bool变量

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;//定义,l为总体,ans为答案(即个数),sum为计数器
  4. int main()
  5. {
  6. cin>>l;//先输入范围
  7. for(int i=2;i<=10000;i++)//循环十万次(为什么从2开始?因为2是最小的质数)
  8. {
  9. if(sum+i<=l)//如果计数器加上下一个数不超出l这个范围,执行接下来的语句
  10. {
  11. bool zs = true;//定义一个名为zs(质数)的bool变量,让它等于true(默认是质数)
  12. }
  13. }
  14. return 0;
  15. }

然后,通过另一个循环嵌套来进行判断这个数有没有因数。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;//定义,l为总体,ans为答案(即个数),sum为计数器
  4. int main()
  5. {
  6. cin>>l;//先输入范围
  7. for(int i=2;i<=10000;i++)//循环十万次(为什么从2开始?因为2是最小的质数)
  8. {
  9. if(sum+i<=l)//如果计数器加上下一个数不超出l这个范围,执行接下来的语句
  10. {
  11. bool zs = true;//定义一个名为zs(质数)的bool变量,让它等于true(默认是质数)
  12. for (int j=2;j*j<=i;j++)//二层循环。j*j<=i是避免2和3这两个质数
  13. {
  14. if (i%j==0)//如果i有因数
  15. {
  16. zs = false;//zs设为否(即合数)
  17. break;//退出循环
  18. }
  19. }
  20. }
  21. }
  22. return 0;
  23. }

最后,进行最后一个判断,判断是否为质数,若是,输出。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;//定义,l为总体,ans为答案(即个数),sum为计数器
  4. int main()
  5. {
  6. cin>>l;//先输入范围
  7. for(int i=2;i<=10000;i++)//循环十万次(为什么从2开始?因为2是最小的质数)
  8. {
  9. if(sum+i<=l)//如果计数器加上下一个数不超出l这个范围,执行接下来的语句
  10. {
  11. bool zs = true;//定义一个名为zs(质数)的bool变量,让它等于true(默认是质数)
  12. for (int j=2;j*j<=i;j++)//二层循环。j*j<=i是避免2和3这两个质数
  13. {
  14. if (i%j==0)//如果i有因数
  15. {
  16. zs = false;//zs设为否(即合数)
  17. break;//退出循环
  18. }
  19. }
  20. if (zs) {//因为zs默认为true(质数),所以如果不是false(合数),就会执行判断下的语句
  21. cout<<i<<endl;//输出这个数
  22. sum+=i;//计数器等于前面的数加上这个数
  23. ans++;//次数也要加
  24. }
  25. }
  26. }
  27. return 0;
  28. }

at last,输出最终的答案。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;//定义,l为总体,ans为答案(即个数),sum为计数器
  4. int main()
  5. {
  6. cin>>l;//先输入范围
  7. for(int i=2;i<=10000;i++)//循环十万次(为什么从2开始?因为2是最小的质数)
  8. {
  9. if(sum+i<=l)//如果计数器加上下一个数不超出l这个范围,执行接下来的语句
  10. {
  11. bool zs = true;//定义一个名为zs(质数)的bool变量,让它等于true(默认是质数)
  12. for (int j=2;j*j<=i;j++)//二层循环。j*j<=i是避免2和3这两个质数
  13. {
  14. if (i%j==0)//如果i有因数
  15. {
  16. zs = false;//zs设为否(即合数)
  17. break;//退出循环
  18. }
  19. }
  20. if (zs) {//因为zs默认为true(质数),所以如果不是false(合数),就会执行判断下的语句
  21. cout<<i<<endl;//输出这个数
  22. sum+=i;//计数器等于前面的数加上这个数
  23. ans++;//次数也要加
  24. }
  25. }
  26. }
  27. cout<<ans;//输出共有几个数
  28. return 0;
  29. }

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int l,ans,sum;
  4. int main()
  5. {
  6. cin>>l;
  7. for(int i=2;i<=10000;i++)
  8. {
  9. if(sum+i<=l)
  10. {
  11. bool zs = true;
  12. for (int j=2;j*j<=i;j++)
  13. {
  14. if (i%j==0)
  15. {
  16. zs = false;
  17. break;
  18. }
  19. }
  20. if (zs) {
  21. cout<<i<<endl;
  22. sum+=i;
  23. ans++;
  24. }
  25. }
  26. }
  27. cout<<ans;
  28. return 0;
  29. }

结果

好吧,又是一道水题

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号