76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
const MAX_COUNT = 103*1e4*1e4 + 11*9 + 1
|
|
|
|
var sv = make([]bool, MAX_COUNT+1)
|
|
var digitSum = make([]int, 1e4)
|
|
|
|
func init() {
|
|
i := 9999
|
|
var s, t int
|
|
for a := 9; a >= 0; a-- {
|
|
for b := 9; b >= 0; b-- {
|
|
s = a + b
|
|
for c := 9; c >= 0; c-- {
|
|
t = s + c
|
|
for d := 9; d >= 0; d-- {
|
|
digitSum[i] = t + d
|
|
i--
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func sieve() {
|
|
n := 0
|
|
for a := 0; a < 103; a++ {
|
|
for b := 0; b < 1e4; b++ {
|
|
s := digitSum[a] + digitSum[b] + n
|
|
for c := 0; c < 1e4; c++ {
|
|
sv[digitSum[c]+s] = true
|
|
s++
|
|
}
|
|
n += 1e4
|
|
}
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
st := time.Now()
|
|
sieve()
|
|
fmt.Println("Sieving took", time.Since(st))
|
|
count := 0
|
|
fmt.Println("\nThe first 50 self numbers are:")
|
|
for i := 0; i < len(sv); i++ {
|
|
if !sv[i] {
|
|
count++
|
|
if count <= 50 {
|
|
fmt.Printf("%d ", i)
|
|
} else {
|
|
fmt.Println("\n\n Index Self number")
|
|
break
|
|
}
|
|
}
|
|
}
|
|
count = 0
|
|
limit := 1
|
|
for i := 0; i < len(sv); i++ {
|
|
if !sv[i] {
|
|
count++
|
|
if count == limit {
|
|
fmt.Printf("%10d %11d\n", count, i)
|
|
limit *= 10
|
|
if limit == 1e10 {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("\nOverall took", time.Since(st))
|
|
}
|