python - 你是怎么做计算器的?
问题描述
我正在制作一个罗马计算器:输入要求进行罗马计算(如 I + IV),输出是罗马数字的答案。如果输出超过1000,则输出为“错误”。这是我的代码:
def toRoman (x):
roman= ""
hundreds = x//100
remainder = x%100 # xx=532, d=532//100=5, x=532%100=32
if hundreds == 1:
roman+="C"
elif hundreds == 2:
roman+="CC"
elif hundreds == 3:
roman+="CCC"
elif hundreds == 4:
roman+="CD"
elif hundreds == 5:
roman+="D"
elif hundreds == 6:
roman+="DC"
elif hundreds == 7:
roman+="DCC"
elif hundreds == 8:
roman+="DCCC"
elif hundreds == 9:
roman+="CM"
tens = remainder//10# d=32//10=3, x= 32%10=2
ones = remainder % 10
if tens == 1:
roman+="X"
elif tens == 2:
roman+="XX"
elif tens == 3:
roman+="XXX"
elif tens == 4:
roman+="XL"
elif tens == 5:
roman+="L"
elif tens == 6:
roman+="LX"
elif tens == 7:
roman+="LXX"
elif tens == 8:
roman+="LXXX"
elif tens == 9:
roman+="XC"
if ones == 1:
roman+="I"
elif ones == 2:
roman+="II"
elif ones == 3:
roman+="III"
elif ones == 4:
roman+="IV"
elif ones == 5:
roman+="V"
elif ones == 6:
roman+="VI"
elif ones == 7:
roman+="VII"
elif ones == 8:
roman+="VIII"
elif ones == 9:
roman+="IX"
return roman
def toDecimal (s):
old= 100000
t = 0
v=0
for i in range(0, len(s)):
if s[i] == "I":
v = 1
elif s[i] == "V":
v = 5
elif s[i] == "X":
v = 10
elif s[i] == "L":
v = 50
elif s[i] == "C":
v = 100
elif s[i] == "D":
v = 500
elif s[i] == "M":
v = 1000
if v > old:
t = v-t
else:
t = t + v
old = v
return t
我有点纠结于如何组合这些功能并制作计算器。任何人都可以帮忙吗?谢谢。
解决方案
这是一种缩短函数并使它们更具可读性的可能方法:
H = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM']
T = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC']
O = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']
V = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 100}
def to_roman(x):
return H[x // 100] + T[(x % 100) // 10] + O[(x % 100) % 10]
def to_decimal(x):
result = 0
i = 0
while i < len(x):
s1 = V[x[i]]
if i + 1 < len(x):
s2 = V[x[i+1]]
if s1 >= s2:
result += s1
i += 1
else:
result += s2 - s1
i += 2
else:
result += s1
i += 1
return result
以下是实现计算器的方法:
number1 = to_decimal(input()) # input a Roman number
operator = input() # input +, -, * or /
number2 = to_decimal(input()) # input a Roman number
if operator == '+':
result = number1 + number2
elif operator == '-':
result = number1 - number2
elif operator == '*':
result = number1 * number2
else:
result = number1 // number2
print(f'Result: {to_roman(result)}')
您仍然应该做一些工作来处理特殊情况(结果不是整数、负数、大于 1000 的数字等的除法)。
推荐阅读
- python - 来自具有特定结构的字符串的字典
- java - 使用 Java 查找/解析 DLL 的依赖 DLL
- javascript - 离子 4 + HttpInterceptor + 令牌
- powershell - 运行 install-package 而不提示安装 nuget
- recursion - 如何在没有运行时多态性的情况下对迭代器执行 N 次“flat_map”(或类似操作)?
- bash - 如何使用 shell 命令运行 tmux
- java - 如何将主类中的变量导入另一个类
- python - Python Pandas 根据“x”值的倍数更新值
- node.js - 错误:ENOENT:.staging 文件夹的所有文件中都没有这样的文件或目录
- python - 我如何制作一个循环,每行打印一个列表的 6 个元素?