当前位置: 首页 > 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学习路线图
  • 阿里内推面试
  • JavaScript-如何实现克隆(clone)函数
  • [译] React v16.8: 含有Hooks的版本
  • 345-反转字符串中的元音字母
  • Angular4 模板式表单用法以及验证
  • Babel配置的不完全指南
  • Java 内存分配及垃圾回收机制初探
  • Node 版本管理
  • orm2 中文文档 3.1 模型属性
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给Prometheus造假数据的方法
  • 工作中总结前端开发流程--vue项目
  • 规范化安全开发 KOA 手脚架
  • 让你的分享飞起来——极光推出社会化分享组件
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何编写一个可升级的智能合约
  • 事件委托的小应用
  • 一起参Ember.js讨论、问答社区。
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #宝哥教你#查看jquery绑定的事件函数
  • $jQuery 重写Alert样式方法
  • (2)MFC+openGL单文档框架glFrame
  • (C语言)fgets与fputs函数详解
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (pojstep1.3.1)1017(构造法模拟)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (第二周)效能测试
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十六)一篇文章学会Java的常用API
  • (数据结构)顺序表的定义
  • (转)项目管理杂谈-我所期望的新人
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net Core与存储过程(一)
  • .net 调用php,php 调用.net com组件 --