我们需要一个将数字转换为单词的函数。Scheme没有提供,所以我们自己编写:
(定义(数字->单词n)
(letrec((ones)(“一”“二”“三”“四”“五”“六”
“七”“八”“九”“十”“十一”“十二”
“十三”“十四”“十五”“十六”
“十七”“十八”“十九”)
(十’(“二十”“三十”“四十”“五十”
“六十”“七十”“八十”“九十”)
(集团(“千”“百万”“十亿”“万亿”)
“四万亿”“五亿”“六亿”
“septillion”“octillion”“nonillion”“debillion”
“十一亿”“十亿”“万亿”
“quattourdecillion”“五十亿”“性十亿”
“septendecillion”“octodecillion”“novmdecillin”
“vigintillion”)
(nnn->单词(λ(n));三位数
(秒(<=100 n)
(字符串附加
(列出个位数(商n 100))
“百”
(如果(正?(模n 100))“”)
(nnn->字(模n 100))
((<=20n)
(字符串附加
(十位数列表(商n 10))
(如果(零?(模n 10))“”
(字符串附加“-”(列出个数(模n 10))))
(其他))
(cond((negative?n)(字符串附加“negatible”(数字->单词(-n)))
((<=#e1e66 n)(错误'num->单词“超出范围”))
((零?n)“零”)
((小于n 1000)(nnn->单词n))
(else(let循环((n n)(组-组))
(let(上(商n 1000))
(组(模n 1000))
(字符串附加
(if(zero?prev)“”
(前循环(cdr组))
(如果(零?组)“”
(字符串附加
(如果(正面?前面)“”)
(nnn->单词组)
(如果(字符串=?“”(汽车组))“”
(字符串附加“”(汽车组))))
有了它,就很容易了。有454个数字在0到1000之间。不可能有其他的oban数字,因为任何较大的数字在拼写中都包含单词“千”或后缀“illion”(斯隆的A008521号):
(每个人)
(λ(n)(显示n)(换行))
(n列表(n范围1000)(不是(字符串索引#\o(数字->单词n))))
我们使用列表推导式和字符串索引来自标准前奏曲。您可以在运行程序http://programmingpraxis.codepad.org/pN3VLfJP.
页码:1 2