Project Euler第22题代码返回结果错误,请求排查问题
问题排查与修正方案
让我来帮你梳理代码里的几个关键错误,这正是导致结果不符的核心原因:
1. 最致命的逻辑错误:排序对象完全搞错了
Project Euler第22题要求先把名字按字典序排序,再计算每个名字的得分乘以它的排名位置(从1开始)。但你的代码里:
namedict = sorted(namedict.values())
这一步是把所有名字的得分单独提取出来排序,完全丢弃了名字的字典序关联!比如,假设名字A得分10、名字B得分5,按字典序A在前,正确计算应该是10*1 +5*2=20,但你的代码会把得分排序成[5,10],计算5*1+10*2=25,结果自然完全偏离正确值。
2. 文件读取与名字解析错误
你的代码里namelst = open(names.txt)是语法错误(文件名需要加引号,比如open("names.txt")),更重要的是:题目提供的names.txt里的名字是"MARY","PATRICIA","LINDA",...这种带双引号、逗号分隔的格式,直接按行读取会导致每个元素包含多余的引号、逗号,甚至多个名字混在一起,计算得分时会把这些非字母字符也算进去,进一步导致错误。
3. 字典使用的逻辑误区
你用字典存储名字和得分,但后续排序时直接丢弃了名字的关联,完全没必要用字典来中转,直接操作名字列表会更清晰。
修正后的代码示例
# 正确读取并解析名字文件 with open("names.txt", "r") as f: content = f.read().strip() # 移除所有双引号,按逗号拆分得到纯净的名字列表 namelst = [name.strip() for name in content.replace('"', '').split(',')] # 按字典序对名字列表排序 namelst_sorted = sorted(namelst) alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] scoresum = 0 # 遍历排序后的名字,同时获取从1开始的排名索引 for rank, name in enumerate(namelst_sorted, start=1): # 计算单个名字的字母得分 name_score = 0 for char in name.lower(): name_score += alphabet.index(char) + 1 # 累加得分乘以排名 scoresum += name_score * rank print(scoresum)
关键修正点说明
- 正确解析名字:先读取文件内容,移除双引号后按逗号拆分,得到无多余字符的纯净名字列表
- 按名字字典序排序:直接对名字列表用
sorted(),完全符合题目要求的排序规则 - 用enumerate简化排名获取:
enumerate(..., start=1)可以直接拿到从1开始的排名索引,不用手动计算位置 - 简化逻辑流程:去掉不必要的字典中转,直接遍历排序后的名字计算,逻辑更直观易懂
内容的提问来源于stack exchange,提问作者tlvwtaiwantau
相关产品推荐
相关产品推荐

