sieve.carbon 971 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. impl as Core.UnformedInit {}
  9. fn Make() -> Sieve {
  10. returned var s: Sieve;
  11. for (n: i32 in Core.Range(1000)) {
  12. s.is_prime[n] = true;
  13. }
  14. return var;
  15. }
  16. fn MarkMultiplesNotPrime[ref self: Self](p: i32) {
  17. var n: i32 = p * 2;
  18. while (n < 1000) {
  19. self.is_prime[n] = false;
  20. n += p;
  21. }
  22. }
  23. var is_prime: array(bool, 1000);
  24. }
  25. fn Run() -> i32 {
  26. var s: Sieve = Sieve.Make();
  27. var number_of_primes: i32 = 0;
  28. for (n: i32 in Core.InclusiveRange(2, 999)) {
  29. if (s.is_prime[n]) {
  30. ++number_of_primes;
  31. Core.Print(n);
  32. s.MarkMultiplesNotPrime(n);
  33. }
  34. }
  35. return number_of_primes;
  36. }