2017-03-08 8 views
0

숫자의 입력을 부분적으로 번역 된 단어 출력으로 변환하는 아래 함수가 있습니다.숫자를 영문자리스트로 변환

제품 및 지수를 사용하여 숫자를 그룹으로 나누면서 숫자 표현을 추가합니다. 예를 들어

: 완전히뿐만 아니라 적은 1000보다 그 숫자를 변환하여 내 문제를 완료하기 위해 노력하고

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

임. 임이 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의 입력을 표시하는 방법으로 올라오고 어렵다 입력이 0

이외의 경우 한 제로는 표시되지 않습니다 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

당신은 3 자리로 수를 떨어져 파괴함으로써 기호 목록에 정수를 번역 할 수 있습니다
(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 자리 그룹을 기호 목록으로 변환 할 수 있습니다.

(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 심볼 목록으로 1,000 이하 번호 변환 : 여기에 구현 샘플이다. 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)