|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- num=[]
- def words(I,V,X,L,C,D,M):
- roman
- _input=input('请输入一个罗马字符:').upper()
-
- for i in _input:
- num.append(i)
- if len(num)>=2:
- if num[0]=='I':
- if num[1] in ['V','X']:
- answer=roman_to_value(num[1])-I
- elif num[1] in ['L','C']:
- answer=roman_to_value(num[1])-X
- elif num[1] in ['D','M']:
- answer=roman_to_value(num[1])-C
- else:
- answer=roman_to_value(num[0])+roman_to_value(num[1])#感觉这串很多余,是否可以删掉?
- else:
- answer=roman_to_value(num[0])+roman_to_value(num[1])
- elif len(num)==1:
- answer=roman_to_value(num[0])
- else:
- answer=0
- print('转换后的结果是:',answer)
- return answer
- def roman_to_value(char,roman_dict=None):#这下面一串就是AI改的了,感觉太复杂了,能不能改简单点?而且关键是我没看懂
- if roman_dict is None:
- roman_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
- return roman_dict.get(char,0)
- words(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)
复制代码 #这里不用对roman_to_value进行补充了吗?
#还有一个灵魂拷问:如果自己打出与小甲鱼给出答案不同的代码,那还要不要花时间去研究答案呢?
[quote]
罗马数字转换代码问题分析
主要问题:
- num= 未初始化为列表(应改为 num=[])
- if num=='I' 判断对象错误(num是列表,应该判断单个字符)
- roman_to_value() 多次错误传递列表参数(应该传单个字符)
- 复杂的if-elif结构无法处理罗马数字减法规则(如IV=4,IX=9等)
优化后代码:
- def roman_to_int(s):
- roman = {'I':1, 'V':5, 'X':10, 'L':50,
- 'C':100, 'D':500, 'M':1000}
- total = 0
- prev_value = 0
-
- for char in reversed(s.upper()):
- value = roman.get(char, 0)
- if value < prev_value:
- total -= value
- else:
- total += value
- prev_value = value
-
- return total
- print(roman_to_int('MCMXCIV')) # 测试输出1994
复制代码
代码特点:
- 逆向遍历字符串,简化减法规则判断
- 使用字典直接查询字符值
- 时间复杂度O(n),空间复杂度O(1)
关于灵魂拷问的回答:
- 先自己测试代码的正确性(用各种边界值测试)
- 对比不同实现的时间复杂度和可读性
- 重点理解算法核心思想(如这里的减法规则实现方式)
- 不同解法可能各有优劣,关键是掌握问题本质
小技巧:罗马数字转换核心规律是 "当前字符值小于右边字符值时需要做减法",逆向遍历可以避免复杂的边界判断。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|