当前位置: 首页 > news >正文

理论知识.质数打表

啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是理论知识.质数打表

为什么需要质数打表

我们已经学习了如何判断一个数是不是质数了,但是还不够。假设要判断很多很多个数是不是质数的时候,之前的学习的方法效率不够高。因为,如果 n 是质数,需要从 2 枚举到 sqrt(n) ,如果题目里面要你几百几千个数逐一判断是否是质数,则很可能会超时。

所谓 质数打表,是指先通过一段比较高效的代码,完成了前期运算,把每一个数是不是质数的信息 表格化 ,在程序的其它位置,如果需要判断一个数是不是质数,只需要去这个预先计算好的表格里面查一下就可以了。

质数打表的算法思路

我们只需要把合数找到,那么自然就能找到质数了。而找合数的思路,则是:从小到大去找质数,每找到一个新的质数,则去把这个质数的倍数标记出来,这些倍数就是合数,而那些自始至终没有被标记过的数就是质数。例如,当我们指导 13 是质数的时候,我们就把 26,39,52,65... 等一系列的合数标记出来。课程E.倍数 的这条题就是演练这个算法思想的。

下面是质数打表的代码:

bool flag[1000001];
void prepare_prime() //质数打表的函数 
{int i,j;for(i=2;i<=1000000;i++){if(!flag[i]) //表示 i是一个质数{for(j=2;i*j<=1000000;j++) //对 j 的倍数(不包含自己)全部设置标记,表示这些数是合数 flag[i*j] = true; }}
}

Copy

执行了上面的 prepare_prime( ) 函数,就产生了 1000000 以内的质数表了。当 flag[i] 为true,表示 i 是合数,flag[i] 为 false 则表示 i 是质数。 1 是特殊的,1 既不是质数又不是合数,单独判断。

常见错误

本来题目要你找出 n 以内的素数,但是你打表的时候的第一层循环只循环到 sqrt(n) ,这是错误的,这会漏掉了很多 比 sqrt(n) 大的质数。

http://www.lryc.cn/news/357740.html

相关文章:

  • FFMPEG+ANativeWinodow渲染播放视频
  • 使用AXI MIG/Proc Sys Reset
  • Android基础-Kotlin语言的作用及优缺点
  • 手机投屏技巧:手机怎么投屏到电脑显示屏上?精选6招解决!
  • 内存函数<C语言>
  • 华为校招机试 - LRU模拟(20240515)
  • AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月29日预测第5弹
  • 03_前端三大件CSS
  • 十种常用数据分析模型
  • salesforce 公式字段 判断一个字段是否在某个多选列表中
  • C++STL容器系列(三)list的详细用法和底层实现
  • IEEE Latex模版踩雷避坑指南
  • 【C++】类与对象——多态详解
  • WordPress建网站公司 建易WordPress建站
  • MySQL正则替换整个单词
  • Java设计模式:享元模式实现高效对象共享与内存优化(十一)
  • 景源畅信电商:抖音开店步骤是什么?
  • Notepad++不显示CRLF的方法
  • 前端开发工程师——AngularJS
  • 【AI算法岗面试八股面经【超全整理】——概率论】
  • vue3 使用vant
  • 网络请求客户端WebClient的使用
  • unity制作app(9)--拍照 相册 上传照片
  • 【busybox记录】【shell指令】mkfifo
  • 使用Jmeter进行性能测试的基本操作方法
  • Linux学习笔记(epoll,IO多路复用)
  • STM32定时器及输出PWM完成呼吸灯
  • 海外仓管理系统费用解析:如何选择高性价比的海外仓系统
  • 深度学习之学习率调度器Scheduler介绍
  • 蓝桥杯-AB路线(详细原创)