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

(算法)求1到1亿间的质数或素数

题目:

求1到1亿间的质数或素数

思路:

什么是质数?

质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。(来自百度百科)

方法1:

遍历1到1亿间的所有数,然后逐个判断是否为质数;

如何判断一个数为质数?根据质数的定义,判断该数是否能被1和它本身之外的数整除,如果是,则不是质数,否则为质数;一般只需判断是否能被2到sqrt(num)的所有数整数。

方法2:

上述方法时间复杂度较高,对于1亿个数而言,不太实际。

其实当我们遍历到某个数(如:n)的时候,所有n的倍数的数字均不为质数,后续我们无需对这个数再做判断的操作,这样可以减少很多不必要的计算;

而且,我们可以从逆向思维来考虑,出了各个n的倍数的数字之外,其他的就是质数,于是少了判断是否为质数的过程。

现在需要做的就是将这些提前判断为非质数的数字保存起来,可以通过一个bool数组,如果某个数字为非质数,则在对应下标的数组位置做标志,以供后续判断。

时间复杂度:O(n),空间复杂度:O(n)

注意:

这里处理的是一亿个数字,因此需考虑机器的内存问题,32位机器的int表示范围为0~2^32-1即4394967295,能表示一亿,一亿个int需要的内存为400M。

(下面的代码建立在内存足够的情况下)

代码:

#include <iostream>
#include <vector>

using namespace std;

const unsigned int MAX_NUM=100;

void Prime(vector<bool> &numbers,vector<int> &primes){
    for(unsigned int i=2;i<=MAX_NUM;i++){
        if(numbers[i]==false){
            primes.push_back(i);
            // multiple of i
            for(unsigned int j=i;j<=MAX_NUM;j+=i)
                numbers[j]=true;
        }
    }
}


int main()
{
    vector<bool> numbers(MAX_NUM,false);
    vector<int> primes;

    Prime(numbers,primes);

    vector<int>::iterator it=primes.begin();
    for(;it!=primes.end();it++){
        cout<<*it<<endl;
    }

    return 0;
}

转载于:https://www.cnblogs.com/AndyJee/p/4695469.html

相关文章:

  • java程序设计之完数
  • css 多行显示省略号....
  • python--参数列表的分拆
  • EL表达式从request和session中取值
  • 经典图论500题
  • 下拉列表框实现二级联动
  • 修改乱码的方法
  • 微信网站注意事项
  • iOS 9应用开发教程之显示编辑文本标签文本框
  • pip常用命令
  • scala学习之类和对象
  • 志于道,志之所趋,无远弗届
  • LeetCode Divide Two Integers
  • iOS学习路线图
  • 阿里内推面试
  • [译]Python中的类属性与实例属性的区别
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android组件 - 收藏集 - 掘金
  • C++类中的特殊成员函数
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Lsb图片隐写
  • SpriteKit 技巧之添加背景图片
  • vue中实现单选
  • - 概述 - 《设计模式(极简c++版)》
  • 构建工具 - 收藏集 - 掘金
  • 入口文件开始,分析Vue源码实现
  • postgresql行列转换函数
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Forward) Music Player: From UI Proposal to Code
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)RocketMQ初步认识
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net CF下精确的计时器
  • .net 托管代码与非托管代码
  • .net连接MySQL的方法
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @AliasFor注解
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android]常见的数据传递方式
  • [ARM]ldr 和 adr 伪指令的区别