Comment detail

整数の漢数字表記 (Nested Flatten)
再帰で書いてみましたが、かなり複雑になってしまいました。loop向きの問題でした。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(defvar *kanji-digits* #("" "一" "二" "三" "四" "五" "六" "七" "八" "九"))
(defvar *kanji-10000-units* #("" "万 " "億 " "兆 " "京 "))
(defvar *kanji-units* #("" "十" "百" "千"))

(defun n-kanji (c unit)
  (concatenate 
    'string
    (cond ((and (equal c "1") (> (mod unit 4) 0)) "")
          (t (aref *kanji-digits* (parse-integer c))))
    (cond ((not (equal c "0"))
           (aref *kanji-units* (mod unit 4))))))
(defun nnnn-kanji (str unit kanji)
  (if (zerop (length str))
    kanji
    (nnnn-kanji
      (subseq str 1) 
      (1+ unit)
      (concatenate 'string (n-kanji (subseq str 0 1) unit) kanji))))
(defun number-kanji (str)
  (if (equal str "0") "零"
    (labels ((rec (str unit kanji)
                  (let ((len (length str)))
                    (if (zerop len)
                      kanji
                      (let ((sub-str (if (> len 4) (subseq str 0 4) (subseq str 0 len))))
                        (rec (if (> len 4) (subseq str 4) "")
                             (+ unit 4)
                             (concatenate
                               'string 
                               (if (equal sub-str (make-string (length sub-str) :initial-element #\0))
                                 ""
                                 (concatenate 
                                   'string
                                   (nnnn-kanji sub-str unit "")
                                   (cond ((> (mod unit 4) 0) "")
                                         (t (aref *kanji-10000-units* (floor unit 4))))))
                               kanji)))))))
      (rec (reverse str) 0 ""))))

(defun main ()
  (loop as n = (progn
                 (format t "input number:")
                 (read-line *standard-input* nil nil))
        do (handler-case 
             (progn 
               (if (equal (string-trim '(#\Space #\Tab #\Newline) n) "") (return))
               (format t "~a~%" (number-kanji n)))
             (error (c) (format t "error! it isn't integer.~%")))))
(main)

Index

Feed

Other

Link

Pathtraq

loading...