fix: rewrite prime numbers using linear sieve

This commit is contained in:
Allen Guan
2021-10-29 11:27:06 +08:00
parent a9312b3901
commit cecc34d460

View File

@@ -10,13 +10,14 @@
* and store in a list * and store in a list
*/ */
std::vector<int> primes(int max) { std::vector<int> primes(int max) {
max++;
std::vector<int> res; std::vector<int> res;
std::vector<bool> numbers(max, false); std::vector<bool> is_not_prime(max+1, false);
for (int i = 2; i < max; i++) { for (int i = 2; i <= max; i++) {
if (!numbers[i]) { if (!is_not_prime[i]) res.emplace_back(i);
for (int j = i; j < max; j += i) numbers[j] = true; for(int p: res) {
res.push_back(i); if (i*p > max) break;
is_not_prime[i*p] = true;
if (i%p == 0) break;
} }
} }
return res; return res;
@@ -25,9 +26,9 @@ std::vector<int> primes(int max) {
/** main function */ /** main function */
int main() { int main() {
std::cout << "Calculate primes up to:\n>> "; std::cout << "Calculate primes up to:\n>> ";
int n; int n = 0;
std::cin >> n; std::cin >> n;
std::vector<int> ans = primes(n); std::vector<int> ans = primes(n);
for (int i = 0; i < ans.size(); i++) std::cout << ans[i] << ' '; for(int p: ans) std::cout << p << ' ';
std::cout << std::endl; std::cout << std::endl;
} }