鱼C论坛

 找回密码
 立即注册
查看: 1027|回复: 6

[已解决]python从0开始 第43讲的编程第0题

[复制链接]
发表于 2024-1-31 21:04:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
罗马数字包含 I、V、X、L、C、D、M 七种字符,分别表示数值 1、5、10、50、100、500、1000。
将数字 2 写做罗马字符的形式是 II(即 I + I),数字 12 写做 XII(即 X + I + I),27 写做 XXVII(即 X + X + V + I + I),这就有点像咱平时上市场买菜给钱的算法(一颗大白菜 27 元,那么就给两张10元,一张5元和两张1元这样的组合)。
罗马字符的组合也存在一些特殊规则,比如 4 不写做 IIII,而是 IV(即 I 在 V 的左边,表示 5 - 1,因此得到数字 4),类似的特例如下:
I 可以放在 V(5)和 X(10)的左边,表示 4 和 9
X 可以放在 L(50)和 C(100)的左边,表示 40 和 90
C 可以放在 D(500)和 M(1000)的左边,表示 400 和 900
题目要求:编写一个函数,将指定的罗马字符转换为数字的形式。
我的代码:
dic1 = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
count = 0

def jisuan2():
    global count
    for j in range(len(list1)):
        if list1[j] + list1[j+1] == "IV" or list1[j] + list1[j+1] == "IX" or list1[j] + list1[j+1] == "XL" or list1[j] + list1[j+1] == "XC" or list1[j] + list1[j+1] == "CD" or list1[j] + list1[j+1] == "CM":
            count = count + (int(dic1.get(list1[j+1])) - int(dic1.get(list1[j])))
            j = j + 2
        else:
            count = count + int(dic1.get(list1[j]))   
    return count
list1 = input("请输入一个罗马字符:")
print("结果是:", jisuan2())

错误原因:IndexError: string index out of range
找不到代码逻辑到底哪里出错 希望大神们帮助一下

最佳答案
2024-1-31 21:54:21
shangshuai 发表于 2024-1-31 21:30
显示第7行IndexError: string index out of range

for 循环那里,len()后面-1


如果解决了的话别忘了给个最佳喔~

评分

参与人数 1鱼币 +5 收起 理由
cjjJasonchen + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-31 21:06:07 | 显示全部楼层
您的代码存在一些问题。首先,您定义了一个名为`list1`的变量来接收用户输入的罗马字符,但您在循环中尝试使用`list1`作为索引来访问字符。这是不正确的,因为字符串是不可更改的,不能像列表一样进行索引操作。要获取字符串的特定字符,您可以通过索引操作符`[]`加上位置索引来实现,例如`list1[j]`。

其次,在判断特殊情况时,您使用了`list1 + list1`来判断是否为特殊组合的罗马数字。这是不正确的,因为`list1`是一个字符串,它不会自动与自身连接。要判断字符串是否为特定值,您可以使用`==`运算符。

最后,虽然您在循环中尝试通过`j = j + 2`来跳过已处理的特殊组合,但这样做是不必要的。您可以通过直接将`j`增加2来实现。此外,由于所有的特殊组合都是由两个字符组成的,所以您可以通过判断`list1[j:j+2]`是否等于特殊组合来处理它们。

以下是修复后的代码示例:
dic1 = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
count = 0

def jisuan2():
    global count
    for j in range(len(list1)):
        if j < len(list1) - 1 and list1[j:j+2] in ["IV", "IX", "XL", "XC", "CD", "CM"]:
            count = count + (dic1[list1[j+1]] - dic1[list1[j]])
            j = j + 1
        else:
            count = count + dic1[list1[j]]    
    return count

list1 = input("请输入一个罗马字符:")
print("结果是:", jisuan2())

希望这可以帮助您解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-31 21:23:16 | 显示全部楼层
看看完整报错信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-31 21:30:38 | 显示全部楼层

显示第7行IndexError: string index out of range
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-31 21:53:26 | 显示全部楼层
dic1 = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
count = z = 0

def jisuan2():
    global count
    global z
    for j in range(len(list1)):
        if z != 0:
            z = z - 1
            continue
        else:
            if list1[j:j+2] in ["IV", "IX", "XL", "XC", "CD", "CM"]:
                count = count + (int(dic1.get(list1[j+1])) - int(dic1.get(list1[j])))  
                z = 1
            else:
                count = count + int(dic1.get(list1[j]))
    return count
list1 = input("请输入一个罗马字符:")
print("结果是:", jisuan2())

谢谢大哥们关系 我刚刚自己改出来了 更改了判定就好啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-31 21:54:21 | 显示全部楼层    本楼为最佳答案   
shangshuai 发表于 2024-1-31 21:30
显示第7行IndexError: string index out of range

for 循环那里,len()后面-1


如果解决了的话别忘了给个最佳喔~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-31 22:03:06 | 显示全部楼层
感谢最佳~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 15:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表