- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以在不转换为十进制数的情况下减去罗马数?
例如:
X - III = VII
所以在输入中我有 X 和 III。在输出中我有 VII。
我需要不转换为十进制数的算法。
现在我不知道。
最佳答案
最简单的算法是为罗马人创建 -- 函数。减去 A-B 意味着同时重复 A-- 和 B--,直到 B 中什么都没有。
但我想做一些更有效的事情
罗马数字可以从某种非常弱的方式看做位置。我们将使用它。
让我们制作简短的减法表:
X-V=V
X-I=IX
IX-I=VIII
VIII-I=VII
VII-I=VI
VI-I=V
V-I=IV
IV-I=III
III-I=II
II-I=I
I-I=_
加法:
V+I=VI
CLX 和 MDC 级别也是如此。当然,您可以只创建一个表,但可以通过替换字母在不同级别上使用它。
让我们将它们分布到 levels=powers of 10 中。以下几个操作将仅在级别内进行。
A=MM+DC+VI, B=CCC+XL+III
然后减去
A-B= MM+(DC-CCC)+(-XL)+(VI-III)
在每个级别,我们都有三个可能的字母:单位、五单位和十单位。组合(单位,五单位)和(单位,十单位)将转化为差异
A-B=MM+(DC-CCC)+(-L+X)+(VI-III)
正常组合(高级符号在初级符号之前)将转换为总和。
A-B= MM+(D+C-C-C-C)+(-L+X)+(V+I-I-I-I)
缩短相同符号的组合
A-B= MM+(D-C-C)+(-L+X)+(V-I-I)
如果某个级别为负,则向高级级别借用一个单元。当然,它可以通过空水平。
A-B= MM+(D-C-C-C)+(C-L+X)+(V-I-I)
现在,在每个级别中,我们将应用我们制作的减法表,减去每个减去的符号,从表的顶部开始并重复它,直到没有减去的成员剩余。
A-B=MM+(CD-C-C)+(L+X)+(IV-I)
A-B=MM+(CCC-C)+(L+X)+(III)
A-B=MM+(CC)+(L+X)+(III)
现在,使用加法表
A-B=MM+(CC)+(LX)+(III)
现在,我们打开括号。如果某个层级中有 '_',则其位置上将没有任何内容。
A-B=MMCCLXIII =2263
结果正确。
关于c# - 罗马数字减法不转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040178/
我正在 prolog 中完成一项作业扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值。例如) 1 ?- roman(N, ['I'], []). N = 1 true. 2 ?- 当我
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试将字符串分成多个部分以读取罗马数字。例如,如果用户输入 "XI" 我希望程序能够理解我是 1,X 是 10,这样才能进行数据验证。 if(string roman == "X") int r
我是一名优秀的程序员,十分优秀!