Self numbers: Difference between revisions

→‎{{header|Go}}: Added a second much faster version.
mNo edit summary
(→‎{{header|Go}}: Added a second much faster version.)
Line 26:
 
=={{header|Go}}==
===Low memory===
Simple-minded, uses very little memory (no sieve) but slow - over 2.5 minutes.
<lang go>package main
Line 103 ⟶ 104:
The 100 millionth self number is 1022727208
Took 2m35.531949399s
</pre>
 
===Sieve based===
Simple sieve, requires a lot of memory but quick - under 3 seconds.
 
Nested 'for's used rather than a recursive function for extra speed.
<lang go>package main
 
import (
"fmt"
"time"
)
 
func sieve() []bool {
sv := make([]bool, 2*1e9+9*9+1)
n := 0
for a := 0; a < 2; a++ {
for b := 0; b < 10; b++ {
for c := 0; c < 10; c++ {
for d := 0; d < 10; d++ {
for e := 0; e < 10; e++ {
for f := 0; f < 10; f++ {
for g := 0; g < 10; g++ {
for h := 0; h < 10; h++ {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
sv[a+b+c+d+e+f+g+h+i+j+n] = true
n++
}
}
}
}
}
}
}
}
}
}
return sv
}
 
func main() {
st := time.Now()
sv := sieve()
count := 0
fmt.Println("The first 50 self numbers are:")
for i := 0; i < len(sv); i++ {
if !sv[i] {
count++
if count <= 50 {
fmt.Printf("%d ", i)
}
if count == 1e8 {
fmt.Println("\n\nThe 100 millionth self number is", i)
break
}
}
}
fmt.Println("Took", time.Since(st))
}</lang>
 
{{out}}
<pre>
The first 50 self numbers are:
1 3 5 7 9 20 31 42 53 64 75 86 97 108 110 121 132 143 154 165 176 187 198 209 211 222 233 244 255 266 277 288 299 310 312 323 334 345 356 367 378 389 400 411 413 424 435 446 457 468
 
The 100 millionth self number is 1022727208
Took 2.647602109s
</pre>
 
9,488

edits