/*
问题描述:给定一个数n,求n以内(不包括n)的所有素数(0,1是非素数)
来源:牛客
作者:syt
问题描述:给定一个数n,求n以内(不包括n)的所有素数(0,1是非素数)
来源:牛客
作者:syt
日期:2017-9-14
思路:刚好看到一个算法课,整理方法如下
*/
#include <iostream>
#include <vector>
using namespace std;
//暴力枚举法
bool isPrime_1(int k)
{
for (int i = 2; i < k; i++)
{
if (k % i == 0)
{
return false;
}
}
return true;
}
vector<int> getPrimes_1(int n)
{
vector<int> primes;
for (int i = 2; i < n; i++)
{
if (isPrime_1(i))
primes.push_back(i);
}
return primes;
}
//改进素数判断方法,对于任意整数,只要该整数不能被小于它的素数整除,该整数即为素数
vector<int> eprimes = { 2, 3 };
bool isPrime_2(int k)
{
if (k <= 1)
return false;
if (k <= 3)
return true;
for (int i = 0; i < eprimes.size(); i++)
{
if (k % eprimes[i] == 0)
{
return false;
}
}
eprimes.push_back(k);
return true;
}
vector<int> getPrimes_2(int n)
{
vector<int> primes;
for (int i = 2; i < n; i++)
{
if (isPrime_2(i))
primes.push_back(i);
}
return primes;
}
//消去法,改进方法2
vector<int> getPrimes_3(int n)
{
vector<int> primes;
vector<bool> isPrimes;
for (int i = 0; i < n; i++)
{
isPrimes.push_back(true);
}
for (int i = 2; i < n; i++)
{
if (isPrimes[i] == true)
{
int p = i;
for (int j = 2; j *p < n; j++)
{
isPrimes[j*p] = false;
}
}
}
for (int i = 2; i < n; i++)
{
if (isPrimes[i])
primes.push_back(i);
}
return primes;
}