乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 93|回复: 2

[编程交流] 罗马数字转换器

[复制链接]

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 14:27:17 | 显示全部楼层 |阅读模式
从昨天开始我一直在做的事情,我想我会把它扔出去,看看你们怎么想。
 
  1. (defun c:roman ( / stnum stst)
  2. (if (> (setq stnum (atoi (setq stst (getstring "\n Enter number between 1 (I) and 3999 (MMMCMXCIX): ")))) 0)
  3.    (rn stnum)
  4.    (rnrev stst))
  5. )
  6. (defun rnrev (st / sl st pout rn prt)
  7. (setq sl (strlen (setq st (strcase st)))
  8.    pout 0
  9.    rn '(("MMM" . 3000) ("MM" . 2000) ("M" . 1000) ("CM" . 900) ("DCCC" . 800) ("DCC" . 700) ("DC" . 600) ("D" . 500) ("CD" . 400) ("CCC" . 300) ("CC" . 200) ("C" . 100) ("XC" . 90) ("LXXX" . 80) ("LXX" . 70) ("LX" . 60) ("L" . 50) ("XL" . 40) ("XXX" . 30) ("XX" . 20) ("X" . 10) ("IX" . 9) ("VIII" .  ("VII" . 7) ("VI" . 6) ("V" . 5) ("IV" . 4) ("III" . 3) ("II" . 2) ("I" . 1))); /setq
  10. (while (and (> sl 0)
  11.          (cdr (assoc (substr st 1 1) rn))); /and
  12.    (cond
  13.      ((setq prt  (cdr (assoc (substr st 1 4) rn)))
  14.       (setq st   (substr st 5))); /cond 1
  15.      ((setq prt  (cdr (assoc (substr st 1 3) rn)))
  16.       (setq st   (substr st 4))); /cond 2
  17.      ((setq prt  (cdr (assoc (substr st 1 2) rn)))
  18.       (setq st   (substr st 3))); /cond 3
  19.      ((setq prt  (cdr (assoc (substr st 1 1) rn)))
  20.       (setq st   (substr st 2))); /cond 4
  21.      ); /cond
  22.    (setq rn   (cutlst rn prt)
  23.      sl   (strlen st)
  24.      pout (+ pout prt)); /setq
  25.    ); /while
  26. (if (= sl 0)
  27.    (princ pout) (princ "Invalid format")); /if
  28. (princ); silent exit
  29. ); /defun
  30. (defun rn (gi / sl is gi numlst pout)
  31. (setq sl (strlen (setq is (itoa gi)))
  32.    numlst (list "1" "2" "3" "4" "5" "6" "7" "8" "9")
  33.    pout "")
  34. (if (and (> gi 0)
  35.       (< gi 4000))
  36.    (progn
  37.      (while (> sl 0)
  38.    (cond
  39.      ((= sl 4)
  40.       (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "M" "MM" "MMM")))
  41.         sl 3)); /cond1
  42.      ((= sl 3)
  43.       (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "C" "CC" "CCC" "CD" "D" "DC" "DCC" "DCCC" "CM")))
  44.         sl 2)); /cond2
  45.      ((= sl 2)
  46.       (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "X" "XX" "XXX" "XL" "L" "LX" "LXX" "LXXX" "XC")))
  47.         sl 1)); /cond3
  48.      ((= sl 1)
  49.       (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX")))
  50.         sl 0)); /cond4
  51.      ); /cond
  52.    (setq is (substr is 2))
  53.    ); /while
  54.      (princ pout)
  55.      ); /progn
  56.    (princ "Number Invalid"); else
  57.    ); /if
  58. (princ)
  59. ); /defun
  60. (defun cutlst (lst num / z)
  61. (cond
  62.    ((> num 900)
  63.     (setq num 1000)); /cond 1
  64.    ((> num 90)
  65.     (setq num 100 )); /cond 2
  66.    ((> num 9)
  67.     (setq num 10 ))); /cond 3
  68. (setq lst (vl-remove-if
  69.          '(lambda (z) (>= (cdr z) num)) lst)); /setq
  70. ); /defun
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:22:34 | 显示全部楼层
很好的一张账单——效果很好。不知道你会在哪里使用它,但作为一个新奇的东西很好
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:52:19 | 显示全部楼层
 
哈哈,是的,我知道。它开始于我试图找出某个罗马数字的含义时。然后我找到了一个转换器,我决定自己做一个。在多次失败后,我终于成功了。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 00:04 , Processed in 0.326028 second(s), 58 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表