找到所有小于N的素数
2013-06-24 11:38
232 查看
素数问题是个博大精深的问题。我这里只是用一种“相对”高效的算法来查找所有小于某个整数的素数。首先来看一下素数的性质:
1.素数不能被除了1和本身之外所有整数整除
2.1不是素数
3.2是素数
4.除了2之外,所有素数均是奇数
算法使用的思想:小于整数N的任意合数一定可以被小于N开方的素数中其中一个整除;也就是说小于N的整数中,只要不能被小于N开方的任一素数整除,那么它就是素数。这样,根据递归思想,要求出小N的所有素数,则先求出小N开方的所有素数集合a,然后再遍历大于N开方小于N的整数分别除以集合a的所有素数,以求出大于N开方小于N的素数集合b,则a+b即为小于N的所有素数;另外,根据上述性质4,在遍历的时候可以跳过所有偶数。
复杂度分析:
时间复杂度:设小于整数n的算法复杂度为Sn,小于n的所有素数个数为an。则时间复杂度的递推公式如下
则个递推公式推起来颇为复杂,我就不算出来了,大概的数量级就是n*a根号n。由于a根号n远小于n,所以复杂度远小于n2。
C++算法如下:
1.素数不能被除了1和本身之外所有整数整除
2.1不是素数
3.2是素数
4.除了2之外,所有素数均是奇数
算法使用的思想:小于整数N的任意合数一定可以被小于N开方的素数中其中一个整除;也就是说小于N的整数中,只要不能被小于N开方的任一素数整除,那么它就是素数。这样,根据递归思想,要求出小N的所有素数,则先求出小N开方的所有素数集合a,然后再遍历大于N开方小于N的整数分别除以集合a的所有素数,以求出大于N开方小于N的素数集合b,则a+b即为小于N的所有素数;另外,根据上述性质4,在遍历的时候可以跳过所有偶数。
复杂度分析:
时间复杂度:设小于整数n的算法复杂度为Sn,小于n的所有素数个数为an。则时间复杂度的递推公式如下
则个递推公式推起来颇为复杂,我就不算出来了,大概的数量级就是n*a根号n。由于a根号n远小于n,所以复杂度远小于n2。
C++算法如下:
#include <cstdlib> #include <iostream> #include <vector> #include <math.h> #include <ctime> using namespace std; vector<int> Find(int lim); int main(int argc, char *argv[]) { time_t b_time,e_time; b_time = time(NULL); vector<int> arr = Find(1440320); e_time = time(NULL); cout<<e_time-b_time<<endl; cout<<arr.size()<<endl; //for(vector<int>::iterator it=arr.begin();it!=arr.end();++it) { //cout<<*it<<"|"; } system("PAUSE"); return EXIT_SUCCESS; } vector<int> Find(int lim) { //利用素数性质:任何不超过一个数的合数,必被小于这个数开方的素数整除 //小于lim的素数 集合 vector<int> arr; //小于lim开方的素数集合 vector<int> a; int sqLim = (int)sqrt(lim); //if(lim > 10) if(lim > 12) { a = Find(sqLim); } else { int rule[5]={2,3,5,7,11}; a.assign(rule,rule+5); return a; } arr.assign(a.begin(),a.end()); if(sqLim%2==0) sqLim++; for(int i=sqLim;i<=lim;i+=2) { bool flag = true; for(vector<int>::iterator it=a.begin();it!=a.end();++it) { int s=*it; if(i%s==0) { flag=false; } } if(flag==true) arr.push_back(i); } return arr; }
相关文章推荐
- 输出所有小于等于n(n为一个大于2的正整数)的素数
- c语言 输出所有小于n(n>=2正整数)的素数
- 输出小于n的所有素数
- 用户输入一个整数,然后显示所有小于或等于该数的素数!
- 素数筛的方法 筛出小于n的所有素数
- 20171207编写一个程序,只接受正整数的输入,然后显示所有小于或等于该数的素数。
- 算法性能比较(一)——找出小于等于n的所有素数
- 打印小于N的所有素数(埃拉托色尼筛法)
- 经典算法题之求小于N的所有素数
- 求小于n的所有素数,按照每行10个显示出来
- 输出小于N的所有质数(素数)
- 创建独立线程来输出小于或等于用户输入数的所有素数
- 输出所有不小于N的素数(一)
- 编写函数int fun(int lim,int aa[100]),该函数的功能是求出小于或等于lim 的所有素数并放在aa数组中,该函数返回所求的素数的个数?
- 输出所有不小于N的素数(二)
- 素数筛法,找到0到max之间的所有素数
- 获取一个整数 然后显示所有小于或等于该数的素数
- 输出所有小于等于n的素数(要求1)每行输出10个(要求2)较优的算法
- 运行程序如下:程序实现的是输出不小于n的所有素数;10个一行
- c++:输出小于1000的所有孪生素数