洛谷每日一题———P5723 【深基4.例13】质数口袋

    今天的题目是在若干质数相关题目中挑选出的一个,具体原因就是——基础、且只涉及质数与循环相关,本身题目也算比较有意思的。

 话不多说,直接进入正题:

题目描述

 小 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    ≤    10^{5}

题目来源:

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

     这道题目是【入门3】循环结构题单中的问题 ,也是普及-难度的问题 。本人在做这道题目之前做了这个题单里的其它题目 , 之前也有一道质数判断相关题目 , 但是偏离了题意 , 把简单的循环结构考察成了降低优化复杂度的题目, 因此最终还是选择了这道更加考察循环结构的题目。

讲解思路:

    首先题目关键是 “ 质数 ” ,因此要先写一个判断质数函数 , 具体思路就是 从 2 到  \sqrt n 判断这些数能否整除 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;
}

算法测试

最后算法测试的性能如下:

运行时间还算不错~毕竟题目也简单。

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值