56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
// Only valid for n > 0 && base >= 2
|
|
func mult(n uint64, base int) (mult uint64) {
|
|
for mult = 1; mult > 0 && n > 0; n /= uint64(base) {
|
|
mult *= n % uint64(base)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Only valid for n >= 0 && base >= 2
|
|
func MultDigitalRoot(n uint64, base int) (mp, mdr int) {
|
|
var m uint64
|
|
for m = n; m >= uint64(base); mp++ {
|
|
m = mult(m, base)
|
|
}
|
|
return mp, int(m)
|
|
}
|
|
|
|
func main() {
|
|
const base = 10
|
|
const size = 5
|
|
|
|
const testFmt = "%20v %3v %3v\n"
|
|
fmt.Printf(testFmt, "Number", "MDR", "MP")
|
|
for _, n := range [...]uint64{
|
|
123321, 7739, 893, 899998,
|
|
18446743999999999999,
|
|
// From http://mathworld.wolfram.com/MultiplicativePersistence.html
|
|
3778888999, 277777788888899,
|
|
} {
|
|
mp, mdr := MultDigitalRoot(n, base)
|
|
fmt.Printf(testFmt, n, mdr, mp)
|
|
}
|
|
fmt.Println()
|
|
|
|
var list [base][]uint64
|
|
for i := range list {
|
|
list[i] = make([]uint64, 0, size)
|
|
}
|
|
for cnt, n := size*base, uint64(0); cnt > 0; n++ {
|
|
_, mdr := MultDigitalRoot(n, base)
|
|
if len(list[mdr]) < size {
|
|
list[mdr] = append(list[mdr], n)
|
|
cnt--
|
|
}
|
|
}
|
|
const tableFmt = "%3v: %v\n"
|
|
fmt.Printf(tableFmt, "MDR", "First")
|
|
for i, l := range list {
|
|
fmt.Printf(tableFmt, i, l)
|
|
}
|
|
}
|