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; }