(算法)求1到1亿间的质数或素数
2015-08-02 11:58
381 查看
题目:
求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; }
相关文章推荐
- 文章标题
- Linxu命令与文件的搜索 - which, whereis, locate, find
- Linxu命令与文件的搜索 - which, whereis, locate, find
- jQuery
- VMWare虚拟机中安装Redhat linux操作系统图解(1)
- Linux vi中文乱码处理
- JDBC在getConnection之前为什么要调用Class.forName
- oracle函数
- centsOs(Linux) memcache 安装教程
- python 中文乱码解决方法
- Android SDK Tools Platform-tools Build-tools
- uva 11524
- 199 无线网络覆盖
- Android-->View.setX()和.setY()的使用(移动布局,设置布局位置,动态添加View)
- hdu 5340 Three Palindromes 【Manacher】
- hdu1452 因子和的积性函数
- linux驱动学习1---Hello World模块
- 格式化输出和printf命令
- OPENCV笔记(三)截取部分区域显示
- SQL建立索引