2017-03-08 16 views
0

数字の入力をその数字の部分的に翻訳された単語出力に変換する以下の機能があります。数字を英語の文字リストに変換する

プロダクトと商を使用して、数値をグループに分割しながら単語の表現を追加します。例えば

(number-name 87969087) -> '(87 million 969 thousand 87) 
(number-name 1000000) -> '(1 million) 

Imは完全にも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)) 

; state words for multiples of ten 
(define multiples '(twenty thirty forty fifty sixty seventy eighty ninety)) 

ので

(number-name 1110) -> '(one thousand one hundred ten) 

その方法でそうすることでもゼロとして表示するために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)) 

答えて

0

あなたは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)))) 

below-1000は、シンボルのリストに1000年の下の数字を変換します。 nsplitは、数字を3桁のグループに分割し、各グループに単位を付加し、below-1000を使用して3桁の数字を変換します。例えば

> (num->lst 0) 
'(zero) 
> (num->lst 1000000001) 
'(one billion one) 
> (num->lst 35579005) 
'(thirty five million five hundred seventy nine thousand five) 
関連する問題