You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:37:19