埃拉托斯特尼筛法(素数高效筛选)

2024-03-08 13:08

本文主要是介绍埃拉托斯特尼筛法(素数高效筛选),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、素数定义

    素数又称质数(prime number),指所有大于1的数中只能被1和它本身整除的数

二、埃拉托斯特尼筛法(Sieve of Eratosthenes)

    1.算法的基本思想:

        如果一个数是质数,那么它的倍数肯定非质,利用事先定义的线性表以打表方式标记非质,则剩下的数就是素数。

    2.筛选过程:

    

三、算法实现

   char *p_sieve=new char[num+1];memset(p_sieve,'1',num*sizeof(char)+1);   //预先置全部数为素数for(unsigned long i=2;i<=sqrt(num);i++)    //循环从4开始,2 3都是素数所以这样跳过没有问题{if(p_sieve[i]=='0')        //已经处理过的数跳过continue;for(unsigned long j=i*i;j<=num;j+=i)    //检测到素数,剔除它的倍数,质为非质p_sieve[j]='0';}

四、类实现

#include <iostream>
#include<memory.h>
#include<cmath>
using namespace std;
class CSieve
{
private:char *p_sieve;unsigned long num;                //numÊÇ×î´ó·¶Î§void Excute_Prime();
public:CSieve(unsigned long n);void printPrime();~CSieve();
};
CSieve::CSieve(unsigned long n)
{num=n;p_sieve=new char[num+1];memset(p_sieve,'1',num*sizeof(char)+1);   //预先置全部数为素数Excute_Prime();
}
void CSieve::Excute_Prime()
{for(unsigned long i=2;i<=sqrt(num);i++)    //循环从4开始,2 3都是素数所以这样跳过没有问题{if(p_sieve[i]=='0')        //已经处理过的数跳过continue;for(unsigned long j=i*i;j<=num;j+=i)    //检测到素数,剔除它的倍数,质为非质p_sieve[j]='0';}
}
void CSieve::printPrime()
{for(unsigned long i=2;i<=num;i++)  if(i==2)cout<<i;elseif(p_sieve[i]-'0')cout<<" "<<i;cout<<endl;
}
CSieve::~CSieve()
{delete p_sieve;
}/******************************测试代码*****************************************/
int main()
{int txt_time;unsigned long n;cin>>txt_time;while(txt_time--){cin>>n;CSieve one_solve(n);one_solve.printPrime();}return 0;
}

五、敲下黑板

    1)预先打表

        一般素数处理的题目都会预先告知数据的最大范围,这个时候就可以采用预处理打表的方法先行处理,输出的时候直接判定线性表的处理结果就可以了。

    2)筛法应用

        埃拉托斯特尼筛法在针对输出范围内的素数或者判定一个数是否为素数都是有比较高效率的,方法都是上面贴的代码那样实现。

    3)NYoj素数三元组

        相应的例题,做过NYoj上面的素数三元组,那个时候我用自己设计的一个筛法,可以看看,传送门:点击打开链接

 

 

     快三个星期没有发文章了,东西攒了很多QwQ,还是会加快效率的,渣油~

这篇关于埃拉托斯特尼筛法(素数高效筛选)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE