(SCHEME):将一个 bigint 分成十、百等。并进入包含英语的列表
(SCHEME): Dividing a bigint into tens, hundreds, ect. And into a list that contains english
所以我很难写这个程序。
scope 是一个程序,它将取一个大数字(比如 1,000,000)并将其拆分为数字(即 1,500,310 -> 100 万 500 千 300 1 十 0 1)。
#lang r5rs
(define (three_names x)
(let loop ((x x)
(myList '()))
(if (< x 10)
(cons x myList)
(loop (quotient x 10)
(cons (remainder x 10) myList)))))
我已经得到它,所以它会循环并 return 在 Whosebug 的帮助下,这些值每个都进入一个列表。
(也就是说,这将取 100 并将其放入 '(1 0 0),这很有用,但还不够有用。自周三以来我一直在敲我的头!)
我会选择这样的东西:
#lang r5rs
(define (three-names n)
(let loop ((n n)
(units '((10 "one") (10 "ten") (10 "hundred") (1000 "thousand") (1000 "million")))
(res ""))
(if (or (zero? n) (null? units))
res
(let* ((unit (car units)) (div (car unit)) (txt (cadr unit)))
(let ((q (quotient n div)) (r (remainder n div)))
(loop q
(cdr units)
(string-append (number->string r) " " txt " " res)))))))
测试:
> (three-names 1500310)
"1 million 500 thousand 3 hundred 1 ten 0 one "
> (three-names 1001)
"1 thousand 0 hundred 0 ten 1 one "
编辑
替代版本
- 适用于初始值 0(在这种情况下,之前的过程不会 return 任何东西)
- 使用符号和 return 列表而不是字符串,正如您在评论中所要求的那样
- 在循环中有一个额外的显示,这将使如何选择 "units" 更清楚:
可能是:
(define (three-names n)
(if (zero? n)
"zero"
(let loop ((n n)
(units '((10 one) (10 ten) (10 hundred) (1000 thousand) (1000 million)))
(res '()))
(display n) (display " - ") (display res) (display " - ") (display units) (newline)
(if (or (zero? n) (null? units))
res
(let* ((unit (car units)) (div (car unit)) (txt (cadr unit)))
(let ((q (quotient n div)) (r (remainder n div)))
(loop q
(cdr units)
(cons r (cons txt res)))))))))
现在:
> (display (three-names 1500310))
1500310 - () - ((10 one) (10 ten) (10 hundred) (1000 thousand) (1000 million))
150031 - (0 one) - ((10 ten) (10 hundred) (1000 thousand) (1000 million))
15003 - (1 ten 0 one) - ((10 hundred) (1000 thousand) (1000 million))
1500 - (3 hundred 1 ten 0 one) - ((1000 thousand) (1000 million))
1 - (500 thousand 3 hundred 1 ten 0 one) - ((1000 million))
0 - (1 million 500 thousand 3 hundred 1 ten 0 one) - ()
(1 million 500 thousand 3 hundred 1 ten 0 one)
所以我很难写这个程序。
scope 是一个程序,它将取一个大数字(比如 1,000,000)并将其拆分为数字(即 1,500,310 -> 100 万 500 千 300 1 十 0 1)。
#lang r5rs
(define (three_names x)
(let loop ((x x)
(myList '()))
(if (< x 10)
(cons x myList)
(loop (quotient x 10)
(cons (remainder x 10) myList)))))
我已经得到它,所以它会循环并 return 在 Whosebug 的帮助下,这些值每个都进入一个列表。
(也就是说,这将取 100 并将其放入 '(1 0 0),这很有用,但还不够有用。自周三以来我一直在敲我的头!)
我会选择这样的东西:
#lang r5rs
(define (three-names n)
(let loop ((n n)
(units '((10 "one") (10 "ten") (10 "hundred") (1000 "thousand") (1000 "million")))
(res ""))
(if (or (zero? n) (null? units))
res
(let* ((unit (car units)) (div (car unit)) (txt (cadr unit)))
(let ((q (quotient n div)) (r (remainder n div)))
(loop q
(cdr units)
(string-append (number->string r) " " txt " " res)))))))
测试:
> (three-names 1500310)
"1 million 500 thousand 3 hundred 1 ten 0 one "
> (three-names 1001)
"1 thousand 0 hundred 0 ten 1 one "
编辑
替代版本
- 适用于初始值 0(在这种情况下,之前的过程不会 return 任何东西)
- 使用符号和 return 列表而不是字符串,正如您在评论中所要求的那样
- 在循环中有一个额外的显示,这将使如何选择 "units" 更清楚:
可能是:
(define (three-names n)
(if (zero? n)
"zero"
(let loop ((n n)
(units '((10 one) (10 ten) (10 hundred) (1000 thousand) (1000 million)))
(res '()))
(display n) (display " - ") (display res) (display " - ") (display units) (newline)
(if (or (zero? n) (null? units))
res
(let* ((unit (car units)) (div (car unit)) (txt (cadr unit)))
(let ((q (quotient n div)) (r (remainder n div)))
(loop q
(cdr units)
(cons r (cons txt res)))))))))
现在:
> (display (three-names 1500310))
1500310 - () - ((10 one) (10 ten) (10 hundred) (1000 thousand) (1000 million))
150031 - (0 one) - ((10 ten) (10 hundred) (1000 thousand) (1000 million))
15003 - (1 ten 0 one) - ((10 hundred) (1000 thousand) (1000 million))
1500 - (3 hundred 1 ten 0 one) - ((1000 thousand) (1000 million))
1 - (500 thousand 3 hundred 1 ten 0 one) - ((1000 million))
0 - (1 million 500 thousand 3 hundred 1 ten 0 one) - ()
(1 million 500 thousand 3 hundred 1 ten 0 one)