sieve.carbon 939 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. import Core library "io";
  5. import Core library "range";
  6. // Compute and return the number of primes less than 1000.
  7. class Sieve {
  8. fn Make() -> Sieve {
  9. returned var s: Sieve;
  10. for (n: i32 in Core.Range(1000)) {
  11. s.is_prime[n] = true;
  12. }
  13. return var;
  14. }
  15. fn MarkMultiplesNotPrime[ref self: Self](p: i32) {
  16. var n: i32 = p * 2;
  17. while (n < 1000) {
  18. self.is_prime[n] = false;
  19. n += p;
  20. }
  21. }
  22. var is_prime: array(bool, 1000);
  23. }
  24. fn Run() -> i32 {
  25. var s: Sieve = Sieve.Make();
  26. var number_of_primes: i32 = 0;
  27. for (n: i32 in Core.InclusiveRange(2, 999)) {
  28. if (s.is_prime[n]) {
  29. ++number_of_primes;
  30. Core.Print(n);
  31. s.MarkMultiplesNotPrime(n);
  32. }
  33. }
  34. return number_of_primes;
  35. }