fork download
  1. package main
  2.  
  3. // The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
  4. // Find the sum of all the primes below two million.
  5.  
  6. import (
  7. "fmt"
  8. "time"
  9. )
  10.  
  11. func getRange(min, max int) (nums []int) {
  12. size := max - min
  13. nums = make([]int, size)
  14. for i := 0; i < size; i++ {
  15. nums[i] = i + min
  16. }
  17. return
  18. }
  19.  
  20. func nextP(nums []int, p int) int {
  21. newIx := (p - 2) + 1
  22. for ; nums[newIx] == 0 && newIx < len(nums); newIx++ {
  23. }
  24. return nums[newIx]
  25. }
  26.  
  27. func ithN(nums []int, targetIx int) int {
  28. for numsFound, vecIx := 0, 0; vecIx < len(nums); vecIx++ {
  29. if nums[vecIx] != 0 {
  30. if numsFound == targetIx {
  31. return nums[vecIx]
  32. }
  33. numsFound++
  34. }
  35. }
  36. return 0
  37. }
  38.  
  39. func sieveTo(max int) (primes []int) {
  40. primes = getRange(2, max)
  41. for i, p := 0, 2; p * p < max; i++ {
  42. for multIx := (p * p) - 2; multIx + 2 < max; multIx += p {
  43. primes[multIx] = 0
  44. }
  45. p = ithN(primes, i + 1)
  46. }
  47. return
  48. }
  49.  
  50. func sum(n []int) (sum uint64) {
  51. for i := 0; i < len(n); i++ {
  52. sum += uint64(n[i])
  53. }
  54. return
  55. }
  56.  
  57. func main() {
  58. start := time.Now()
  59. fmt.Println(sum(sieveTo(200000)))
  60. bench := time.Now().Sub(start)
  61. fmt.Println(bench)
  62. }
Success #stdin #stdout 0s 421248KB
stdin
Standard input is empty
stdout
1709600813
4.252ms