67 lines
1.9 KiB
Fortran
67 lines
1.9 KiB
Fortran
program spell
|
|
|
|
implicit none
|
|
integer :: e
|
|
integer :: i
|
|
integer :: m
|
|
integer :: n
|
|
character (9), dimension (19), parameter :: small = &
|
|
& (/'one ', 'two ', 'three ', 'four ', &
|
|
& 'five ', 'six ', 'seven ', 'eight ', &
|
|
& 'nine ', 'ten ', 'eleven ', 'twelve ', &
|
|
& 'thirteen ', 'fourteen ', 'fifteen ', 'sixteen ', &
|
|
& 'seventeen', 'eighteen ', 'nineteen '/)
|
|
character (7), dimension (2 : 9), parameter :: tens = &
|
|
& (/'twenty ', 'thirty ', 'forty ', 'fifty ', 'sixty ', &
|
|
& 'seventy', 'eighty ', 'ninety '/)
|
|
character (8), dimension (3), parameter :: big = &
|
|
& (/'thousand', 'million ', 'billion '/)
|
|
character (256) :: r
|
|
|
|
do
|
|
read (*, *, iostat = i) n
|
|
if (i /= 0) then
|
|
exit
|
|
end if
|
|
if (n == 0) then
|
|
r = 'zero'
|
|
else
|
|
r = ''
|
|
m = abs (n)
|
|
e = 0
|
|
do
|
|
if (m == 0) then
|
|
exit
|
|
end if
|
|
if (modulo (m, 1000) > 0) then
|
|
if (e > 0) then
|
|
r = trim (big (e)) // ' ' // r
|
|
end if
|
|
if (modulo (m, 100) > 0) then
|
|
if (modulo (m, 100) < 20) then
|
|
r = trim (small (modulo (m, 100))) // ' ' // r
|
|
else
|
|
if (modulo (m, 10) > 0) then
|
|
r = trim (small (modulo (m, 10))) // ' ' // r
|
|
r = trim (tens (modulo (m, 100) / 10)) // '-' // r
|
|
else
|
|
r = trim (tens (modulo (m, 100) / 10)) // ' ' // r
|
|
end if
|
|
end if
|
|
end if
|
|
if (modulo (m, 1000) / 100 > 0) then
|
|
r = 'hundred' // ' ' // r
|
|
r = trim (small (modulo (m, 1000) / 100)) // ' ' // r
|
|
end if
|
|
end if
|
|
m = m / 1000
|
|
e = e + 1
|
|
end do
|
|
if (n < 0) then
|
|
r = 'negative' // ' ' // r
|
|
end if
|
|
end if
|
|
write (*, '(a)') trim (r)
|
|
end do
|
|
|
|
end program spell
|