From cecc34d460052bb2fcb3703534b30de2ad75adab Mon Sep 17 00:00:00 2001 From: Allen Guan Date: Fri, 29 Oct 2021 11:27:06 +0800 Subject: [PATCH] fix: rewrite prime numbers using linear sieve --- math/prime_numbers.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/math/prime_numbers.cpp b/math/prime_numbers.cpp index 4dd54f136..55d76d30d 100644 --- a/math/prime_numbers.cpp +++ b/math/prime_numbers.cpp @@ -10,13 +10,14 @@ * and store in a list */ std::vector primes(int max) { - max++; std::vector res; - std::vector numbers(max, false); - for (int i = 2; i < max; i++) { - if (!numbers[i]) { - for (int j = i; j < max; j += i) numbers[j] = true; - res.push_back(i); + std::vector is_not_prime(max+1, false); + for (int i = 2; i <= max; i++) { + if (!is_not_prime[i]) res.emplace_back(i); + for(int p: res) { + if (i*p > max) break; + is_not_prime[i*p] = true; + if (i%p == 0) break; } } return res; @@ -25,9 +26,9 @@ std::vector primes(int max) { /** main function */ int main() { std::cout << "Calculate primes up to:\n>> "; - int n; + int n = 0; std::cin >> n; std::vector 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; }