今天的题目是在若干质数相关题目中挑选出的一个,具体原因就是——基础、且只涉及质数与循环相关,本身题目也算比较有意思的。
话不多说,直接进入正题:
题目描述
小 A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。
口袋的负载量就是口袋里的所有数字之和。
但是口袋的承重量有限,装的质数的和不能超过 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 ≤ 。
题目来源:
这道题目是【入门3】循环结构题单中的问题 ,也是普及-难度的问题 。本人在做这道题目之前做了这个题单里的其它题目 , 之前也有一道质数判断相关题目 , 但是偏离了题意 , 把简单的循环结构考察成了降低优化复杂度的题目, 因此最终还是选择了这道更加考察循环结构的题目。
讲解思路:
首先题目关键是 “ 质数 ” ,因此要先写一个判断质数函数 , 具体思路就是 从 2 到 判断这些数能否整除 n ,如果存在可以整除 n 的数 ,说明不是质数 ,否则是质数 :
//判断是不是质数
bool isPrime(int n)
{
if (n == 1) //1不是质数
{
return false;
}
else
{
bool result = true;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
result = false;
return result;
}
}
return result;
}
}
注意:这里选择判断到根号 n ,而不是到 n !!!这样可以提高时间效率!
主函数中就是一系列条件判断 :
首先判断当前质数之和 + 要判断的这个数 是否小于等于规定值 L :
若小于 ,进入下一步判断要判断的数是否为质数:
若是质数 , 输出这个数 ,并将这个数加到质数总和中 ,同时质数数量加 1 ;
否则 , 自增 1 ,进入第一层条件判断
否则 ,直接结束判断, 输出质数总数 并返回。
完整代码可见:
#include <iostream>
#include <math.h>
using namespace std;
//判断是不是质数
bool isPrime(int n)
{
if (n == 1)
{
return false;
}
else
{
bool result = true;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
result = false;
return result;
}
}
return result;
}
}
int main()
{
int L;
cin >> L;
int sum = 0;
int i = 2;
int num=0;
while (sum <= L)
{
if (sum + i <= L)
{
if (isPrime(i))
{
cout << i << endl;
num++;
sum += i;
}
i++;
}
else
{
break;
}
}
cout << num << endl;
return 0;
}
算法测试
最后算法测试的性能如下:
运行时间还算不错~毕竟题目也简单。