-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy path275.go
61 lines (55 loc) · 1.07 KB
/
275.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// UVa 275 - Expanding Fractions
package main
import (
"fmt"
"io"
"os"
"strconv"
)
func divide(n, d int) (int, string) {
cache := make(map[int]int)
digits := []byte{'.'}
var pre int
var ok bool
for n != 0 {
if pre, ok = cache[n]; ok {
break
}
cache[n] = len(digits)
n *= 10
digits = append(digits, strconv.Itoa(n / d)[0])
n %= d
}
if n == 0 {
return 0, string(digits)
}
return len(digits) - pre, string(digits)
}
func output(out io.Writer, length int, digits string) {
for i := 0; i <= len(digits)/50; i++ {
segment := digits[i*50 : min((i+1)*50, len(digits))]
if len(segment) > 0 {
fmt.Fprintln(out, segment)
}
}
if length == 0 {
fmt.Fprintln(out, "This expansion terminates.")
} else {
fmt.Fprintf(out, "The last %d digits repeat forever.\n", length)
}
fmt.Fprintln(out)
}
func main() {
in, _ := os.Open("275.in")
defer in.Close()
out, _ := os.Create("275.out")
defer out.Close()
var n, d int
for {
if fmt.Fscanf(in, "%d%d", &n, &d); n == 0 && d == 0 {
break
}
length, digits := divide(n, d)
output(out, length, digits)
}
}