fork download
  1. #include <cmath>
  2. #include <iostream>
  3. #include <vector>
  4. #include <stdint.h>
  5.  
  6. namespace {
  7. // yield all prime numbers less than limit.
  8. // http://r...content-available-to-author-only...e.org/wiki/Category:C%2B%2B
  9. template<class UnaryFunction>
  10. void primesupto(int limit, UnaryFunction yield)
  11. {
  12. std::vector<bool> is_prime(limit, true);
  13.  
  14. const int sqrt_limit = static_cast<int>(std::sqrt(limit));
  15. for (int n = 2; n <= sqrt_limit; ++n)
  16. if (is_prime[n]) {
  17. yield(n);
  18.  
  19. for (unsigned k = n*n, ulim = static_cast<unsigned>(limit); k < ulim; k += n)
  20. //NOTE: "unsigned" is used to avoid an overflow in `k+=n` for `limit` near INT_MAX
  21. is_prime[k] = false;
  22. }
  23.  
  24. for (int n = sqrt_limit + 1; n < limit; ++n)
  25. if (is_prime[n])
  26. yield(n);
  27. }
  28. }
  29.  
  30. int main() {
  31. uintmax_t sum = 0;
  32. primesupto(2000000, [&sum] (int prime) { sum += prime; });
  33. std::cout << sum << std::endl;
  34. }
  35.  
Success #stdin #stdout 0.01s 2828KB
stdin
Standard input is empty
stdout
142913828922