sieve.carbon 950 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. // Compute and return the number of primes less than 1000.
  6. class Sieve {
  7. fn Make() -> Sieve {
  8. returned var s: Sieve;
  9. // TODO: `for` loop.
  10. var n: i32 = 0;
  11. while (n < 1000) {
  12. s.is_prime[n] = true;
  13. ++n;
  14. }
  15. return var;
  16. }
  17. fn MarkMultiplesNotPrime[addr self: Self*](p: i32) {
  18. var n: i32 = p * 2;
  19. while (n < 1000) {
  20. self->is_prime[n] = false;
  21. n += p;
  22. }
  23. }
  24. var is_prime: [bool; 1000];
  25. }
  26. fn Run() -> i32 {
  27. var s: Sieve = Sieve.Make();
  28. var number_of_primes: i32 = 0;
  29. var n: i32 = 2;
  30. while (n < 1000) {
  31. if (s.is_prime[n]) {
  32. ++number_of_primes;
  33. Core.Print(n);
  34. s.MarkMultiplesNotPrime(n);
  35. }
  36. ++n;
  37. }
  38. return number_of_primes;
  39. }