计算 -3

来源:互联网 发布:ipad专业画图软件 编辑:程序博客网 时间:2024/06/03 21:00

埃拉托色尼筛法求素数:


这是最简单朴素的素数筛法了,根据wikipedia,时间复杂度为 O(n \log\log n),空间复杂度为O(n)。
算法思想:先假定所有的数都是素数,然后从最小的素数2出发,把素数的所有倍数筛出去。又因为一个数的质因数都是成对出现的,比如100 = 1*100 = 2*50 = …..= 10*10,所以筛素数时只用筛到 n的开平方就行了。


以下为C++的代码:

#include<iostream>#include<string>#include<vector>#include<algorithm>#include<cmath>using namespace std;inline void keep_window_open() { char ch; cin >> ch; }int main(){    vector<bool>prime;//定义一个布尔类型的向量    prime.push_back(false);//这点感觉有点别扭,虽然需要把前两个向量元素设为假,因为0和1都不是素数    prime.push_back(false);    for (int i = 2; i < 100; i++)//这里的100可以换成n    {        prime.push_back(true);    }    for (int i = 2; i < sqrt(100); i++)//素数判断范围可以到开方即可    {        if (prime[i])        {            for (int j = i; j * i < 100; j++)//剔除所有成倍的元素            {                prime[j*i] = false;            }        }    }    for (int i =0;i<100;i++)    {        if(prime[i])        cout << "The prime number is " << i << '\n';    }    system("PAUSE");}
原创粉丝点击