50 lines
990 B
C++
50 lines
990 B
C++
/*
|
|
* Реализация решета Эратосфена
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
// Решето Эратосфена
|
|
std::vector<int> sieveOfEratosthenes(int n)
|
|
{
|
|
// 1. Выписываем подряд все числа от 2 до n
|
|
std::vector<int> prime;
|
|
for (int i = 2; i <= n; i++)
|
|
{
|
|
prime.push_back(i);
|
|
}
|
|
|
|
// 2. Пусть переменная p равна первому простому числу в массиве.
|
|
int p = prime[0];
|
|
|
|
// 3. Зачеркиваем числа, кратные p
|
|
step_3:
|
|
for (int i = 0; i < prime.size(); i++)
|
|
{
|
|
if (prime[i] == p)
|
|
{
|
|
continue;
|
|
}
|
|
if (prime[i] % p == 0)
|
|
{
|
|
prime.erase(prime.begin() + i);
|
|
i--;
|
|
}
|
|
}
|
|
|
|
// 4. Найти первое не зачеркнутое число больше p
|
|
for (int i = 0; i < prime.size(); i++)
|
|
{
|
|
if (prime[i] > p)
|
|
{
|
|
p = prime[i];
|
|
goto step_3;
|
|
}
|
|
}
|
|
|
|
return prime;
|
|
}
|
|
|