List 将数字转换为英文字母列表

List 将数字转换为英文字母列表,list,scheme,lisp,racket,List,Scheme,Lisp,Racket,下面的函数将数字输入转换为这些数字的部分翻译输出 使用乘积和商,它添加数字的单词表示,同时将数字拆分为组 例如: (number-name 87969087) -> '(87 million 969 thousand 87) (number-name 1000000) -> '(1 million) 我试图通过完全翻译那些小于1000的数字来完成我的问题。我正在尝试实现一个小于1000的函数,它将在构建列表时显示这些较小的数字。旁边: ;; for less than 1000 ;

下面的函数将数字输入转换为这些数字的部分翻译输出

使用乘积和商,它添加数字的单词表示,同时将数字拆分为组

例如:

(number-name 87969087) -> '(87 million 969 thousand 87)
(number-name 1000000) -> '(1 million)
我试图通过完全翻译那些小于1000的数字来完成我的问题。我正在尝试实现一个小于1000的函数,它将在构建列表时显示这些较小的数字。旁边:

;; for less than 1000
; state words for 1-19
(define baseNumbers '(one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen))

所以

也很难找到一种方法来显示输入0,以显示为零,如果输入不是0,则零不会显示

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(define (number n)
  (define units '(thousand million billion trillion quadrillion))
  (define (nsplit n units acc lst)
    (define q (quotient n 1000))
    (define r (remainder n 1000))
    (if (zero? n) lst
        (cond [(zero? acc)
               (if (zero? r)
                   (nsplit q units (add1 acc) lst)
                   (nsplit q units (add1 acc) (cons r lst)))]
              [(zero? r)
               (nsplit q (cdr units) acc lst)]
              [else
               (nsplit q (cdr units) acc (cons r (cons (car units) lst)))])))
  (nsplit n units 0 empty))

您可以将整数转换为符号列表,方法是将数字拆分为3位数字组,将单位附加到每个组,然后将3位数字组进一步转换为符号列表。下面是一个示例实现:

(define (num->lst num)
  (define bases '(one two three four five six seven eight nine ten eleven twelve
                  thirteen fourteen fifteen sixteen seventeen eighteen nineteen))
  (define multiples '(twenty thirty forty fifty sixty seventy eighty ninety))
  (define units '(empty thousand million billion trillion quadrillion quintillion
                        sextillion septillion octillion nonillion decillion))
  (define (below-1000 num bases mults)
    (cond [(zero? num) empty]
          [(< num 20) (list (list-ref bases (sub1 num)))]
          [(< num 100) (list* (list-ref mults (- (quotient num 10) 2))
                              (below-1000 (remainder num 10) bases mults))]
          [else (list* (list-ref bases (sub1 (quotient num 100))) 'hundred
                       (below-1000 (remainder num 100) bases mults))]))
  (define (nsplit num lst units)
    (define q (quotient num 1000))
    (define r (remainder num 1000))
    (if (zero? num) lst
        (cond [(zero? r) (nsplit q lst (cdr units))]
              [else (nsplit q (append (below-1000 r bases multiples)
                                      (cons (car units) lst)) (cdr units))])))
  (if (zero? num) '(zero)
      (remove 'empty (nsplit num empty units))))
(define (number n)
  (define units '(thousand million billion trillion quadrillion))
  (define (nsplit n units acc lst)
    (define q (quotient n 1000))
    (define r (remainder n 1000))
    (if (zero? n) lst
        (cond [(zero? acc)
               (if (zero? r)
                   (nsplit q units (add1 acc) lst)
                   (nsplit q units (add1 acc) (cons r lst)))]
              [(zero? r)
               (nsplit q (cdr units) acc lst)]
              [else
               (nsplit q (cdr units) acc (cons r (cons (car units) lst)))])))
  (nsplit n units 0 empty))
(define (num->lst num)
  (define bases '(one two three four five six seven eight nine ten eleven twelve
                  thirteen fourteen fifteen sixteen seventeen eighteen nineteen))
  (define multiples '(twenty thirty forty fifty sixty seventy eighty ninety))
  (define units '(empty thousand million billion trillion quadrillion quintillion
                        sextillion septillion octillion nonillion decillion))
  (define (below-1000 num bases mults)
    (cond [(zero? num) empty]
          [(< num 20) (list (list-ref bases (sub1 num)))]
          [(< num 100) (list* (list-ref mults (- (quotient num 10) 2))
                              (below-1000 (remainder num 10) bases mults))]
          [else (list* (list-ref bases (sub1 (quotient num 100))) 'hundred
                       (below-1000 (remainder num 100) bases mults))]))
  (define (nsplit num lst units)
    (define q (quotient num 1000))
    (define r (remainder num 1000))
    (if (zero? num) lst
        (cond [(zero? r) (nsplit q lst (cdr units))]
              [else (nsplit q (append (below-1000 r bases multiples)
                                      (cons (car units) lst)) (cdr units))])))
  (if (zero? num) '(zero)
      (remove 'empty (nsplit num empty units))))
> (num->lst 0)
'(zero)
> (num->lst 1000000001)
'(one billion one)
> (num->lst 35579005)
'(thirty five million five hundred seventy nine thousand five)