- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我将编写一个程序,将罗马数字转换为阿拉伯数字,反之亦然。我已经有一个用于转换 4000 以下数字的工作代码。对于高于或等于 4000 的罗马数字,新的书写方式是括号表示乘以 1000。例如 4000 是 (IV),6010 是 (VI) X等感谢您的回答。丹尼尔
编辑:好的,解决问题了。没有大于 3999 的罗马数字,因此书写更大数字的方法是在罗马数字两边加上横线(或括号),表示该数字应乘以 1000
现在的功能:
def intToRoman(integer):
rlist = romanList = [(1000, "M"),(900, "CM"),(500, "D"),(400, "CD"),(100, "C"),(90, "XC"),(50, "L"),(40, "XL"),(10, "X"),(9, "IX"),(5, "V"),(4, "IV"),(1, "I")]
romanResult = ""
for wholeNumber in rlist:
while integer >= wholeNumber[0]:
integer -= wholeNumber[0]
romanResult += wholeNumber[1]
return romanResult
def romanToInt(numeral):
rlist = romanList = [(1000, "M"),(900, "CM"),(500, "D"),(400, "CD"),(100, "C"),(90, "XC"),(50, "L"),(40, "XL"),(10, "X"),(9, "IX"),(5, "V"),(4, "IV"),(1, "I")]
index = 0
intResult = 0
for integer, romanNumeral in rlist:
while numeral[index : index + len(romanNumeral)] == romanNumeral:
intResult += integer
index += len(romanNumeral)
最佳答案
您可以使用divmod()
function一步生成整个除数和余数:
>>> divmod(45, 10)
(4, 5)
这是 4 乘以 10 余数 5。
有了这个函数,它既可以生成简单的罗马数字输出,又可以处理 4000 的指数的罗马数字变得更加简单。每个较高的指数都包含在逐渐增加的括号中:
romanList = [
(1000, "M"), (900, "CM"),
(500, "D"), (400, "CD"),
(100, "C"), (90, "XC"),
(50, "L"), (40, "XL"),
(10, "X"), (9, "IX"),
(5, "V"), (4, "IV"),
(1, "I")
]
def intToRoman(integer):
result = []
parenscount = 0
while integer:
integer, num = divmod(integer, 4000)
romanResult = ""
for value, rchar in romanList:
count, num = divmod(num, value)
romanResult += count * rchar
if romanResult:
result.append('{}{}{}'.format(
'(' * parenscount, romanResult, ')' * parenscount))
parenscount += 1
return ' '.join(result[::-1])
因为我们在结果
中按照从小到大的顺序添加罗马数字,所以在将字符串连接在一起时,您确实需要反转末尾的列表; result[::-1]
使用负步骤反转列表。
我将 romanList
移至全局,我们可以稍后在将罗马数字解析回数字时重用它。
演示:
>>> intToRoman(2013)
'MMXIII'
>>> intToRoman(3999)
'MMMCMXCIX'
>>> intToRoman(4000)
'(I)'
>>> intToRoman(4010230)
'(MII) MMCCXXX'
>>> intToRoman(237310230)
'((XIV)) (MMMCCCXXVII) MMCCXXX'
另一个方向,那么,我们可以化简,每次找到右括号时将结果乘以 4000:
def romanToInt(numeral):
result = 0
while numeral:
preparse_length = len(numeral)
groupresult = 0
numeral = numeral.lstrip('( ') # remove opening parens and spaces
for value, rchar in romanList:
while numeral.startswith(rchar):
groupresult += value
numeral = numeral[len(rchar):]
if len(numeral) == preparse_length:
# No valid numerals found, not a Roman numeral then
raise ValueError(
'ValueError: invalid literal for romanToInt: {!r}'.format(numeral))
while numeral[:1] == ')':
groupresult *= 4000
numeral = numeral[1:]
result += groupresult
return result
演示:
>>> romanToInt('MMXIII')
2013
>>> romanToInt('MMMCMXCIX')
3999
>>> romanToInt('(I)')
4000
>>> romanToInt('(MII) MMCCXXX')
4010230
>>> romanToInt('((XIV)) (MMMCCCXXVII) MMCCXXX')
237310230
>>> romanToInt('booh')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 14, in romanToInt
ValueError: ValueError: invalid literal for romanToInt: 'booh'
关于python - 转换大于 4000 的罗马/阿拉伯数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20703154/
你有一个这样输出的文件: 1 2 哪些输出: 1 2 3 现在如果我想要如下输出: ? ? ? 好吧,我希望我可以输出阿拉伯语/波斯语版本的 1,2,3 而不是“?”。如何使用 HTML
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我是一名优秀的程序员,十分优秀!