题目:求1到n之间的素数,n>=2。
方法一:试除法。判断3到n之间所有奇数是否为素数。判断一个数是否为素数时,只需试除小于等于根号n的所有素数。
bool IsPrime(int n, const vector<int> &res)
{
int mark = sqrt(n);
for (int index=0; index<res.size() && res[index]<=mark; index++)
{
if (n%res[index] == 0)
return false;
}
return true;
}
vector<int> FindPrimes(const int &n)
{
vector<int> res;
if (n <= 1)
return res;
res.push_back(2);
for (int i = 3; i <= n; i+=2)
{
if (IsPrime(i,res))
res.push_back(i);
}
return res;
}
方法二:筛选法。
int FirstTrue(const vector<bool> &IsPrime, int start)
{
for (int i = start; i < IsPrime.size(); i++)
{
if (IsPrime[i])
return i;
}
return IsPrime.size();
}
vector<int> FindPrimes2(const int &n)
{
vector<int> res;
if (n <= 1)
return res;
vector<bool> IsPrime(n + 1, true);
int i = 2;
while (i=FirstTrue(IsPrime, i), i<= n)
{
res.push_back(i);
for (int a = 2, j = i *a; j <= n; a++)
{
IsPrime[j] = false;
j = i*(a+1);
}
i++;
}
return res;
}