From 1f6c39bcf28759e46195426f2dfa2b82cf776a21 Mon Sep 17 00:00:00 2001 From: Allen Guan Date: Mon, 1 Nov 2021 07:47:16 +0800 Subject: [PATCH] fix: rewrite prime numbers using linear sieve (#1810) * fix: rewrite prime numbers using linear sieve * fix code scanning error * clang-format and clang-tidy fixes for 0afd463b * fix sign-compare warning * clang-format and clang-tidy fixes for 6ddff0f7 Co-authored-by: David Leal Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> --- math/prime_numbers.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/math/prime_numbers.cpp b/math/prime_numbers.cpp index 4dd54f136..cd6aca0ca 100644 --- a/math/prime_numbers.cpp +++ b/math/prime_numbers.cpp @@ -9,14 +9,22 @@ /** Generate an increasingly large number of primes * and store in a list */ -std::vector primes(int max) { - max++; +std::vector primes(size_t 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 (size_t i = 2; i <= max; i++) { + if (!is_not_prime[i]) { + res.emplace_back(i); + } + for (int p : res) { + size_t k = i * p; + if (k > max) { + break; + } + is_not_prime[k] = true; + if (i % p == 0) { + break; + } } } return res; @@ -25,9 +33,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; }