100 lines
1.8 KiB
C++
Executable File
100 lines
1.8 KiB
C++
Executable File
#include <iostream>
|
|
#include <list>
|
|
#include <cmath>
|
|
using namespace std;
|
|
|
|
|
|
|
|
int main() {
|
|
int start, end;
|
|
|
|
cin >> start;
|
|
cin >> end;
|
|
// const int start = 1;
|
|
// const int end = 1000000;
|
|
|
|
|
|
|
|
list<int> primes;
|
|
|
|
primes.push_back(1);
|
|
primes.push_back(2);
|
|
primes.push_back(3);
|
|
primes.push_back(5);
|
|
|
|
// Fill all numbers, excluding most obvious non-primes numbers
|
|
for (int i = 6; i <= end; i++) {
|
|
if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0) {
|
|
continue;
|
|
}
|
|
primes.push_back(i);
|
|
}
|
|
|
|
auto it = primes.begin();
|
|
advance(it, 4);
|
|
|
|
int stop = sqrt(end);
|
|
for (it; *it <= stop; it++) {
|
|
/*
|
|
Go through all numbers in the list that are lower than sqrt(end)
|
|
The list is modified in the loop, allowing to skip processing of some numbers
|
|
*/
|
|
int factor = *it;
|
|
|
|
auto it2 = it;
|
|
it2++;
|
|
|
|
auto stop2 = primes.end();
|
|
for (it2; it2 != stop2; it2++) {
|
|
/*
|
|
Go through all numbers that are greater than the *it,
|
|
removing them if they can be divided by *it
|
|
*/
|
|
|
|
if (*it2 % factor == 0) {
|
|
auto tmp = next(it2);
|
|
|
|
primes.erase(it2);
|
|
|
|
it2 = prev(tmp);
|
|
}
|
|
}
|
|
}
|
|
|
|
// A dumb way to handle end < 5
|
|
if (end < primes.back()) {
|
|
auto trueEnd = primes.begin();
|
|
auto stop = primes.end();
|
|
while (trueEnd != stop && *trueEnd <= end) {
|
|
trueEnd++;
|
|
}
|
|
primes.erase(trueEnd, stop);
|
|
}
|
|
|
|
|
|
auto startIt = primes.end();
|
|
auto primesEnd = primes.end();
|
|
|
|
it = primes.begin();
|
|
for (it; it != primesEnd; it++) {
|
|
if (*it >= start) {
|
|
startIt = it;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (start == end && *startIt != start) {
|
|
// Range contains only one number and it's not prime
|
|
cout << "Absent" << endl;
|
|
} else if (it == primesEnd) {
|
|
cout << "Absent" << endl;
|
|
} else {
|
|
it = startIt;
|
|
for (it; it != primesEnd; it++) {
|
|
cout << *it << " ";
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
return 0;
|
|
} |