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
|
procedure main(arg)
every write( number(!arg, 0) )
end
procedure number(n, state)
static small, large, units
initial {
small := ["one", "two", "three", "four", "five", "six", "seven", "eight",
"nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
large := ["ten", "twenty", "thirty", "forty", "fifty", "sixty",
"seventy", "eighty", "ninety"]
units := ["thousand", "million", "billion", "trillion", "quadrillion",
"quintillion", "sextillion", "septillion", "octillion", "nonillion"]
}
n := integer(n) | fail
if 0 = n then return "zero"
if 0 > n then return "minus " || number(-n)
if 20 > n then return small[n]
if 100 > n then {
x := n / 10
r := n % 10
if (0 = r) then {
return large[x]
} else {
return large[x] || "-" || number(r, state)
}
}
if (1000 > n) then {
x := n / 100
r := n % 100
if (0 = r) then {
return number(x, 1) || " hundred"
} else {
if (0 = state) then {
return number(x, 1) || " hundred and " || number(r, 1)
} else {
return number(x, 1) || " hundred " || number(r, 1)
}
}
}
every i := 1 to *units do {
j := (*units - i + 1)
k := j * 3
m := 10^k
x := n / m
r := n % m
if (0 < x) then {
if (0 = r) then {
return number(x, 1) || " " || units[j]
} else if ( 100 > r) then {
return number(x, 1) || " " || units[j] || " and " || number(r, 1)
} else {
return number(x, 1) || " " || units[j] || ", " || number(r, 0)
}
}
}
return "Error NaN: " || n
end
|