埃拉托色尼筛法求素数:
这是最简单朴素的素数筛法了,根据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");
}