ccsu 1079求解素数 筛选法

2024-05-10 03:32
文章标签 筛选 求解 素数 1079 ccsu

本文主要是介绍ccsu 1079求解素数 筛选法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

筛选法求素数

当数据量比较大时候,判素数的方法是会超时的,我们将前面的那道例题改造一下,变成下面这个题目:

桐桐的思考

桐桐在学完了上节课的知识后,对信息学越发感兴趣了。桐桐是一个很善于思考的学生,她发现上节课中例题的n最大是40000,如果数据再大一些,比如n=106,那么判素数的算法能否在1秒内给出答案呢?桐桐用程序实际测试的时间超过了1秒,你能帮助可爱的桐桐解决这个难题吗?即:在1秒的时间内输出不大于n(1<N≤106)的所有素数。

【输入样例】

10

【输出样例】

2 3 5 7

我们用一个数组a来标识素数的情况(0是,1不是),首先将大于1且不大于n的所有数都标识为素数。举一个例子,n=9时,初始化为:

 

2    

3      

4        

5      

6      

7     

8     

9        

数组a

0

0

0

0

0

0

0

0

 

 

 

从2开始判断,2是素数,因此2的倍数(倍数>1)肯定不是素数,将其筛去:

 

2     

3      

4       

5   

6     

7     

8       

9         

数组a

0

0

1

0

1

0

1

0

 

 

 

接着是3,3没有被2的倍数筛去,因此3是素数,将3的倍数(倍数>1)筛去:

 

2      

3       

4        

5       

6        

7       

8       

9    

数组a

0

0

1

0

1

0

1

1

 

 

 

接着是4,4是2的倍数已被筛去,4的2倍也是2的4倍数已被筛去,4的3倍已超过9不必考虑。

接着是5,5没有被前面的数筛去,即说明5不能被2~4的数整除,因此5是素数,5的2倍是10,已经超过9不必考虑。

接着是6,6是2的3倍已被筛去,6的倍数与前类同。

接着是7,7没有被前面的数筛去,说明7是素数,7的倍数与前类同。

接着是8,8是2的4倍已被筛去,8的倍数与前类同。

接着是9,9是3的倍数已被筛去,9的倍数与前类同。

现在有一个问题:难道要枚举到9才结束吗?这样的话效率依然没有提高。大家可以发现上述例子中,枚举到4(包括4)以后便没有新的数被筛去,为什么?我们来看4的时候,此时4的2倍已经在考虑2的倍数时筛去,4的3倍便超过了9,这是因为9的平方根是3,任意两个不同的数(>=3)相乘肯定会大于9。因此,在考虑5,6,7,8,9时,他们的倍数(倍数>1)均超过了n的最大值9,不必考虑;他们自身如果没有被前面的数筛去,即是素数,否则不是。

所以,对于输入的n来说,本算法只需要枚举到n的平方根,即可将不大于n的所有素数标识出来。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int a[1000000];
bool find(int x)
{for(int i=2;i<sqrt(x);i++)if(x%2 !=0)return false;return true;
}
int main()
{int tmp;int n;while(scanf("%d",&n)){if(n == 0)break;memset(a,0,sizeof(a));for(int i=2;i<=sqrt(n);i++){if(a[i] == 0&&find(a[i])){int j=i;tmp=2;while(j<=n){j=i*tmp;a[j] = 1;tmp++;}}}for(int i=2;i<=n;i++){if(a[i]==0)printf("%d ",i);}printf("\n");}return 0;
}


这篇关于ccsu 1079求解素数 筛选法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975315

相关文章

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

Superset二次开发之Select 筛选器源码分析

路径:superset-frontend/src/filters/components/Select  源码文件: 功能点: 作用 交互 功能 index.ts作为模块的入口点,导出其他文件中定义的主要组件和函数。它使其他文件中的导出可以被外部模块使用。 SelectFilterPlugin.tsx 定义主要的插件类 SelectFilterPlugin 和组件 Sele

移动UI:分类列表页、筛选页的设计揭秘。

移动UI的列表页设计需要考虑用户体验和界面美观性,以下是一些建议的设计要点: 1. 列表项的展示: 列表页应该清晰地展示各个列表项,包括标题、副标题、缩略图等内容,以便用户快速浏览和识别。可以使用卡片式布局或者简洁的列表布局。 2. 搜索和筛选: 如果列表项较多,应该提供搜索和筛选功能,方便用户查找感兴趣的内容。搜索框和筛选条件可以放置在页面顶部或者底部,以便用户方便操作。

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

如何借助AI快速筛选和整理文献?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 在撰写毕业论文时,文献综述是必不可少的部分。它不仅为你的研究提供理论背景,还展示了你对研究领域的深入理解。然而,文献综述的撰写过程常常让学生感到头疼,尤其是面对海量文献时,如何有效筛选、整理和撰写是一大难题。 本文将为大家介绍如何利用AI工具帮助你轻松高效地完成文献综述的写作。我们将详细讲解如何快速

【机器学习 sklearn】特征筛选feature_selection

特征筛选更加侧重于寻找那些对模型的性能提升较大的少量特征。 继续沿用Titannic数据集,这次试图通过特征刷选来寻找最佳的特征组合,并且达到提高预测准确性的目标。 #coding:utf-8from __future__ import divisionimport sysreload(sys)sys.setdefaultencoding('utf-8')import timest

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

很多数据进行筛选 orcale 语句

很多数据进行筛选  orcale  语句 一段时间内的数据,先按照时间分组,求出每组时间的数据的最大id,然后对获得的数据排序 如,现有一个月的数据将近1000条,每天都有很多条,先求出每天所有数据中id最大的一条数据,这样每天只有一条数据,在按照时间进行排序,就可以获得这个月的数据(30条),大大减少了数据量 其中:HD_GPS是表名, T_LOG是时间     sel

js算法判断是否为素数

/*判断一个数字是否是质数: 质数(prime number)又称素数,有无限个。除了1和它本身以外不再被其他的除数整除。*/ function isPrime(number){ //判断输入是否为number类型,是否为整数       if (typeof number!=='number'||!Number.isInteger(number))      {