C++数论————质数筛法(单独判断一个数,判断N个数) 埃氏筛法

news2024/11/23 7:15:59

质数想必大家都不陌生

从小学到大

质数的概念:一个数如果除了1和本身之外没有其他的因子,那么这个数被称为质数

今天要讲两个知识点:

  1. 在C++中如何判断一个数是否为质数

  1. 在C++中如何判断1-N之间哪些数为整数

    • 在C++中如何判断一个数是否为质数

这个知识点较为简单

充分利用上面的概念

我们用一个for循环来解决

因为对于每个数来说,1和n都是他们的因子

所以循环开始为2,终止为n-1

for (int i=2;i<n;i++){
    if (n%i==0){
        return false;
    }
}
return true;

But……

时间复杂度也忒高了吧

大概就是O(n)

那如果n>10^9的话,那直接出1秒了

所以还得优化

咱们来举个例子,n=16:

n的因子有

1 2 4 8 16

可以看出,4就像一条分割线,分成了前后两部分

前后一一对应

没错 优化的点找到了

循环前面的部分,如果前面都没有的话,那么后面肯定也没有

那么循环终止条件是什么呢?

4是16的什么数?

因数?

算术平方根!

也就是C++中的sqrt

恭喜你!优化成功

代码就不写了,就是把循环条件的n改成sqrt(n),然后加个cmath头文件

成功把时间复杂度降到O()

第一个问题成功解决

    • 在C++中如何判断1-N之间哪些数为整数

会不会有一些小伙伴说了

哎哟不就是刚才的刚才的函数调用n编吗?至于单列出来一个标题吗~

NONONONONOONONNOONONONONONO

大错特错

这篇文章的主要就在这里

举个例子,10^9都用不上,咱就说n小于等于10^6,还是很常见的吧

那么时间复杂度就是O(10^6*循环次数)

也就那么亿点点的时间就好了

所以还是那句话,优化优化优化

恭迎今天主角:埃氏筛法!

网友:埃氏筛法 满足你的一切需要!

先讲一下他的思想

思想:

  1. 一个合数,一定可以拆成一个质数与另一个数的乘积

  1. 每个质数的倍数都是合数

基于以上这两条思想,就可以实现埃氏筛法

  1. 用一个数组表示每个数的状态,即是否为质数

  1. 循环每个数,如果是质数,就把他所有的倍数全部标为合数

没错就是这么简单

时间复杂度计算方面,我真的很拉

埃氏筛法大概O(n log n)左右吧

(大佬勿喷)

void eratosthemes_prim(int n){
    for (int i=2;i<=n;i++){
        if_p[i]=true;
    }
    for (int i=2;i<=n;i++){
        if (is_p[i]){
            num++;
            p[num]=i;//p数组存放质数,num代表目前质数个数
            for (int j=i<<1;j<=n;j+=i){
                is_p[j]=false;
            }
        }
    }
}

这样是不是快了很多?

别走!来看道简简单单的例题

Goldbach's Conjecture
题目描述

全屏
哥德巴赫猜想:任何大于4的偶数都可以拆成两个奇素数之和。 比如:

8=3+5

20=3+17=7+13

42=5+37=11+31=13+29=19+23

你的任务是:验证小于106的数满足哥德巴赫猜想。

输入
多组数据,每组数据一个n。

读入以0结束。

输出
对于每组数据,输出形如n = a + b,其中a,b是奇素数,=和+两边都有空格。若有多组满足条件的a,b,输出b-a最大的一组。
若无解,输出Goldbach's conjecture is wrong.。

样例输入1
8
20
42
0

样例输出1
8 = 3 + 5
20 = 3 + 17
42 = 5 + 37

提示/说明
【数据范围与提示】

对于全部数据,6≤n≤106。

思想:运用埃氏筛法筛出所有数的情况

循环遍历情况即可

# include <iostream>
# include <cstdio>
# include <cstring>
#define N 1000005
using namespace std;
int n,vis[N],flag;
int main(){
    memset(vis,0,sizeof(vis));
    vis[0]=vis[1]=1;
    for(int i=2;i<=N/2;i++){
        if(vis[i]==0){
            for(int j=2*i;j<=N;j=j+i){
                vis[j]=1;
            }
        }    
    }
    while(scanf("%d",&n)&&n){
        flag=0;
        for(int i=3;i<=N/2;i++){
            if(vis[i]==0&&vis[n-i]==0){
                printf("%d = %d + %d\n",n,i,n-i);
                flag=1;
                break;
            }
        }    
        if(flag==0){
            printf("Goldbach's conjecture is wrong.\n");
        }
    }
    return 0;
}

有些人也许会问

题目里说的是奇素数,可你的代码中没体现出奇数这个条件啊?

问这个问题的,思考一下,偶数可能是素数吗?所以不需要考虑

还有一个问题:陈景润都没证明出哥德巴赫是错的,你还判断一下有必要吗?

这个是可以删除的!

都看到这里了,不点个赞吗?

今天的质数就讲解到这里

欢迎大家关注我

持续更新——

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当湖北《汉川》遇到湖南《早安隆回》,杨语莲会是下一个袁树雄吗

古有花木兰&#xff0c;替父去从军。如今在中国华语乐坛&#xff0c;继《早安隆回》袁树雄之后&#xff0c;又出现了《汉川》杨语莲。之所以把这两首歌曲&#xff0c;以及这两位音乐人&#xff0c;放在一起来做对比&#xff0c;是因为这两首歌曲&#xff0c;甚至这两位音乐人&a…

Java中weekOfYear和weekOfWeekBasedYear的区别

这其实是计算一年中的周数&#xff08;某日属于一年中的第几周&#xff09;的两种算法。 简单来说&#xff0c;前者保证了1周不会跨越自然年的边界&#xff1b;后者保证了1周一定有7天&#xff0c;一定从某个DayOfWeek&#xff08;如周一&#xff09;开始&#xff0c;并且1周只…

时序预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络时间序列预测 目录时序预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现GWO-BiLSTM灰狼算法优化双向长短…

每天花2小时恶补腾讯T8纯手打688页SSM框架和Redis,成功上岸美团

前言 我相信大家也都跟我一样&#xff0c;每天不是在加班就是在加班的路上&#xff0c;辛辛苦苦付出&#xff0c;可是得到的却不是很多。 这可能是大部分程序员的现状吧&#xff01;&#xff01; 最关键的是&#xff0c;整天都在CRUD、实现需求&#xff0c;真的想跟产品经理…

广发证券基于分布式架构的新一代估值系统实践

文 / 广发证券信息技术部 来源 / 金融电子化 随着信息技术应用创新试点范围不断扩大&#xff0c;能否胜任更多业务场景&#xff0c;是各行各业当前阶段选型数据库的关键。早在 2019 年&#xff0c;广发证券即开启对分布式架构的数据库产品进行调研&#xff0c;并经历了单主从读…

Git 提交模式

Git 对我们 Devs 的使用是必不可少的&#xff0c;无论是在个人项目中&#xff0c;还是在多人开源项目或整个社区中。鉴于此&#xff0c;正确使用 git commit很重要。拥有连贯和标准化的语言有助于参与项目的每个人理解已经发生的变化。在上图中&#xff0c;我们看到了评论不当的…

Camtasia2023简体中文版支持4K超清屏幕录屏

Camtasia 2023是TechSmith出品的一款屏幕录像和编辑的软件&#xff0c;可轻松录制和分享高质量的截屏视频&#xff0c;提供所需的工具和功能。功能强大的视频编辑器&#xff0c;通过记录您的屏幕活动和网络摄像头流&#xff0c;帮助您创建具有专业外观的截屏视频。软件提供了强…

“华为杯”研究生数学建模竞赛2005年-【华为杯】B题:空中加油问题的递推模型与调度策略

赛题描述 对飞行中的飞机进行空中加油,可以大大提高飞机的直航能力。为了简化问题,便于讨论,我们作如下假设。 少辅机架数两种情况给出你的作战方案。 论文 摘要 : 本文首先对空中加油问题进行了分析,提取了相关性质,在此基础上 建立了问题的递推模型。根据该模型,文…

使用DcokerCompose部署微服务项目详解

一、项目结构 我这里准备了一个微服务项目。 里面包含三个服务模块&#xff1a; card-service、use-rservice以及网关gateway。 一个公共模块&#xff1a; fegin-api。 其中fegin-api被card-service和user-service引用。 二、基于项目构建部署目录结构 这个springcloud-a…

电子档案备份相对于数据备份的特别之处

最近在和档案馆信息部门领导交流过程中&#xff0c;他们提出了一个很实际的困惑&#xff1a;《“十四五”全国档案事业发展规划》&#xff08;以下简称&#xff1a;《十四五规划》&#xff09;中明确提出了“电子档案备份中心”建设&#xff0c;并且要求“扎实做好档案数字资源…

检索业务:排序和价格区间及库存

排序 点击某个排序时首先按升序显示&#xff0c;再次点击再变为降序&#xff0c;并且还会显示上升或下降箭头 页面排序跳转的思路是通过点击某个按钮时会向其class属性添加/去除desc&#xff0c;并根据属性值进行url拼接 点击排序时 $(".sort_a").click(function () …

如何恢复回收站被清空的文件?你必须要知道的4种方法

电脑回收站里面有很多我们之前删除的文件&#xff0c;如果想要恢复这些文件&#xff0c;直接还原就可以了。但是回收站里面的数据被清空了怎么办&#xff1f;如何恢复回收站被清空的文件&#xff1f;接下来就给大家分享一些恢复回收站文件被删除的方法&#xff01; 方法一、使用…

AcWing 1068. 环形石子合并(环形区间DP)

AcWing 1068. 环形石子合并&#xff08;环形区间DP&#xff09;一、问题二、思路三、代码一、问题 二、思路 在讲解这道题之前&#xff0c;我们需要先掌握线性的区间DP问题&#xff0c;如果对于线性区间DP的解决方式还不了解的话&#xff0c;建议先看一下这篇文章&#xff1a;…

概论第7章_参数估计_点估计的评价标准_相合性_无偏性_有效性

点估计的评价标准包括&#xff1a; 相合性&#xff0c; 无偏性&#xff0c; 有效性。 一. 相合性 衡量一个估计是否可行的必要条件&#xff0c; 就是估计的相合性。 本文不提其定义了。直接给出一些结论。 结论 设有正态总体N(μ,σ2\mu, \sigma^2μ,σ2) 的样本&#xff0c;…

数据结构资料汇编:栈

数据结构资料汇编&#xff1a;栈 定义 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入或删除操作的线性表。 表尾称为栈顶&#xff08;top&#xff09;&#xff0c;可以进行插入或删除操作 栈的插入操作称为进栈或入栈&#xff08;push&#xff09;栈的删除操作成为出…

Google Play 上的 Shady Reward 应用累积了 2000 万次下载

一种新的活动跟踪应用程序类别最近在 Android 的官方应用程序商店 Google Play 上取得了巨大成功&#xff0c;已在超过 2000 万台设备上下载。 这些应用程序将自己宣传为健康、计步器和养成良好习惯的应用程序&#xff0c;承诺为用户在日常生活中保持活跃、达到距离目标等提供…

字节青训前端笔记 | 跨端技术概述

本节课程内容会分为以下几个方面&#xff1a; 跨端是什么&#xff0c;给大家介绍跨端产生的背景及解决的问题跨端技术方案介绍&#xff0c;给大家介绍目前主流的跨端技术方案&#xff08;hybrid 方案/原生渲染方案/自渲染方案/小程序方案&#xff09;以及对比基于小程序跨端实…

苹果或将打造 “空气键盘”

苹果MR头显玩法大揭秘前言苹果MR头显要来了打造 “空气键盘”眼动追踪与手部追踪一键切换VR/AR模式前言 随着2021年10月FaceBook正式改名Meta后&#xff0c;标志着元宇宙元年的正式到来&#xff0c;元宇宙行业开始出现井喷式的爆发。再到2022年10月&#xff0c;“飞天云动”在…

欧科云链链上卫士:2023年1月安全事件盘点

一、基本信息 2023年1月安全事件共造成约1438万美元损失&#xff0c;相比上个月的安全事件损失金额大幅度下降。其中多链项目LendHub 被攻击&#xff0c;损失高达600万美元&#xff0c;为本月资金损失最大的安全事件。本月RugPull数量基本与上月持平。社媒诈骗等事件依然频发&a…

分布式微服务3

目录 Feign远程调用 基于Feign远程调用 Feign替代RestTemplate 1.引入依赖 2.添加注释 3.编写Feign的客户端 4.测试 5.总结 自定义配置 1.引入依赖 2.配置连接池 3.总结 Gateway网关 Gateway快速入门 1.创建gateway服务&#xff0c;引入依赖 2.编写启动类 3.编写…