博客
关于我
P3383 素数筛
阅读量:799 次
发布时间:2023-02-26

本文共 1842 字,大约阅读时间需要 6 分钟。

C++程式实现——埃式筛法求质数

最近在学习C++编程,我决定尝试实现一个质数筛选算法——埃式筛法。埃式筛法是一种高效的筛选质数的方法,以前在数学课上老师也简单提到过,但一直没机会深入实践。下面我将一步一步记录我的实现过程。

准备工作

首先,我需要准备一些必要的头文件。质数判断和筛选常用到的标准库包括<iostream><string>, 所以我在代码最开始处包含了这两个头文件:

#include 
#include

接着,我还需要使用<cstdio>来处理标准输入输出,以及<cstring>来操作字符串函数:

#include 
#include

为了方便使用,我在代码的最顶部声明了using namespace std;,这样可以在代码中直接使用std::中的函数和类别,而无需每次都写std::

using namespace std;

定义与函数声明

接下来,我定义了几个辅助变量和函数。首先是isprime数组,用来记录哪些数是质数。由于常见的质数范围较大,我定义了一个长度为10000001的数组isprime,并初始化isprime[1]true,因为1通常不被认为是质数:

bool isprime[10000001];isprime[1] = true;

然后是p数组,用于记录每个数的质数前置数。p[i]表示i的最小质因数:

int p[10000001];p[1] = 0;

接下来是void sieve(int n)函数,用于实现埃式筛法:

void sieve(int n){    if(n < 2)        return;        p[1] = 0;    isprime[1] = true;        for(int i = 2; i <= n; i++)    {        if(isprime[i] == false)        {            p[i] = p[i - 1] + 1;            for(int j = i * i; j <= n; j += i)            {                isprime[j] = true;            }        }        else            p[i] = p[i - 1];    }}

主函数实现

最后是int main()主函数,用于实现对质数的判断:

int main(){    int a, b;    scanf("%d%d", &a, &b);        sieve(a);        for(int i = 1; i <= b; i++)    {        int x;        scanf("%d", &x);        if(!isprime[x])            printf("Yes\n");        else            printf("No\n");    }        return 0;}

实现总结

整个程序的实现过程如上所述。通过调用void sieve(int n)函数,我们可以生成一个质数数组isprime,其中isprime[i]true表示i是质数。然后,我们可以通过isprime数组快速判断输入的数字是否为质数。

在编写代码的过程中,我也遇到了一些需要注意的地方:

  • 初始值设置isprime[1]被初始化为true,但在质数判断中,1通常不被认为是质数。因此,在isprime[x]判断时,需要特别注意这一点。

  • 循环条件:在筛选过程中,外层循环的终止条件是i <= n。内层循环的条件是j = i * i; j <= n; j += i,这样可以避免重复筛选多次。

  • 性能优化:埃式筛法的时间复杂度是O(n log log n),对于较大的数值来说,性能非常优异。在实际应用中,可以根据需要调整筛选范围。

  • 输入处理:在主函数中,使用scanf函数读取输入数据。需要注意的是,scanf函数会自动处理输入的空格和换行符,因此在读取多个数字时,可以直接连续使用scanf函数。

  • 通过上述实现,我成功地将埃式筛法在C++语言中实现出来,并能够根据输入的两个数值快速判断另一个数值是否为质数。这对于解决实际问题具有重要的意义。

    转载地址:http://ucvfk.baihongyu.com/

    你可能感兴趣的文章
    openpyxl 模块的使用
    查看>>
    Openresty框架入门详解
    查看>>
    OpenResty(1):openresty介绍
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>
    OpenStack 搭建私有云主机实战(附OpenStack实验环境)
    查看>>
    OpenStack 综合服务详解
    查看>>
    OpenStack 网络服务Neutron详解
    查看>>
    Openstack 网络管理企业级实战
    查看>>
    Openstack(两控制节点+四计算节点)-1
    查看>>
    openstack--memecache
    查看>>
    openstack-keystone安装权限报错问题
    查看>>
    openstack【Kilo】汇总:包括20英文文档、各个组件新增功能及Kilo版部署
    查看>>
    openstack下service和endpoint
    查看>>
    Openstack企业级云计算实战第二、三期培训即将开始
    查看>>
    OpenStack创建虚拟机实例实战
    查看>>
    OpenStack安装部署实战
    查看>>
    OpenStack实践系列⑨云硬盘服务Cinder
    查看>>
    OpenStack架构
    查看>>