101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func indexOf(n int, s []int) int {
|
|
for i, j := range s {
|
|
if n == j {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
func getDigits(n, le int, digits []int) bool {
|
|
for n > 0 {
|
|
r := n % 10
|
|
if r == 0 || indexOf(r, digits) >= 0 {
|
|
return false
|
|
}
|
|
le--
|
|
digits[le] = r
|
|
n /= 10
|
|
}
|
|
return true
|
|
}
|
|
|
|
var pows = [5]int{1, 10, 100, 1000, 10000}
|
|
|
|
func removeDigit(digits []int, le, idx int) int {
|
|
sum := 0
|
|
pow := pows[le-2]
|
|
for i := 0; i < le; i++ {
|
|
if i == idx {
|
|
continue
|
|
}
|
|
sum += digits[i] * pow
|
|
pow /= 10
|
|
}
|
|
return sum
|
|
}
|
|
|
|
func main() {
|
|
start := time.Now()
|
|
lims := [5][2]int{
|
|
{12, 97},
|
|
{123, 986},
|
|
{1234, 9875},
|
|
{12345, 98764},
|
|
{123456, 987653},
|
|
}
|
|
var count [5]int
|
|
var omitted [5][10]int
|
|
for i, lim := range lims {
|
|
nDigits := make([]int, i+2)
|
|
dDigits := make([]int, i+2)
|
|
blank := make([]int, i+2)
|
|
for n := lim[0]; n <= lim[1]; n++ {
|
|
copy(nDigits, blank)
|
|
nOk := getDigits(n, i+2, nDigits)
|
|
if !nOk {
|
|
continue
|
|
}
|
|
for d := n + 1; d <= lim[1]+1; d++ {
|
|
copy(dDigits, blank)
|
|
dOk := getDigits(d, i+2, dDigits)
|
|
if !dOk {
|
|
continue
|
|
}
|
|
for nix, digit := range nDigits {
|
|
if dix := indexOf(digit, dDigits); dix >= 0 {
|
|
rn := removeDigit(nDigits, i+2, nix)
|
|
rd := removeDigit(dDigits, i+2, dix)
|
|
if float64(n)/float64(d) == float64(rn)/float64(rd) {
|
|
count[i]++
|
|
omitted[i][digit]++
|
|
if count[i] <= 12 {
|
|
fmt.Printf("%d/%d = %d/%d by omitting %d's\n", n, d, rn, rd, digit)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fmt.Println()
|
|
}
|
|
|
|
for i := 2; i <= 6; i++ {
|
|
fmt.Printf("There are %d %d-digit fractions of which:\n", count[i-2], i)
|
|
for j := 1; j <= 9; j++ {
|
|
if omitted[i-2][j] == 0 {
|
|
continue
|
|
}
|
|
fmt.Printf("%6d have %d's omitted\n", omitted[i-2][j], j)
|
|
}
|
|
fmt.Println()
|
|
}
|
|
fmt.Printf("Took %s\n", time.Since(start))
|
|
}
|