法一:根号判别法
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 101; //表长
int prime[maxn]; //prime数组存放所有素数
int pNum; //素数个数
bool p[maxn] = {false}; //p[i]==true表示i是素数
bool isPrime(int n)
{
if (n <= 1) //特判
{
return false;
}
int sqr = (int)sqrt(1.0 * n);
for (int i = 2; i <= sqr; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
void Find_Prime()
{
for (int i = 1; i < maxn; i++)
{
if (isPrime(i))
{
prime[pNum++] = i;
p[i] = true;
}
}
}
int main()
{
Find_Prime();
for (int i = 0; i < pNum; i++)
{
cout << prime[i] << ' ';
}
return 0;
}
如果用这种方式枚举1~n的范围内的素数。
那么枚举的时间复杂度为 O ( n ) O(n) O(n),判断素数的复杂度为 O ( n ) O(\sqrt{n}) O(n),因此总复杂度为 O ( n n ) O(n\sqrt{n}) O(nn)。这个复杂度对于n不超过 1 0 5 10^5 105都没有问题。
法二:筛选法
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 101; //表长
int prime[maxn]; //prime数组存放所有素数
int pNum; //素数个数
bool p[maxn] = {false}; //p[i]==true表示i被筛掉,则i不是素数
void Find_Prime()
{
for (int i = 2; i < maxn; i++)
{
if (p[i] == false)
{
prime[pNum++] = i;
for (int j = i + i; j < maxn; j = j + i)
{
p[j] = true;
}
}
}
}
int main()
{
Find_Prime();
for (int i = 0; i < pNum; i++)
{
cout << prime[i] << ' ';
}
return 0;
}
这种方法的复杂度为 O ( n l o g l o g n ) O(nloglogn) O(nloglogn)。