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

Python凯撒密码解密练习求助:输出正确但判定错误

凯撒密码解密代码问题排查与修复

你的代码能处理常规字母偏移,但未考虑字母循环边界的情况,导致当解密后字符超出ASCII字母范围时,输出非预期的非字母字符(比如@、_等),这是练习判定错误的核心原因。

问题分析

凯撒密码要求字母在A-Z/a-z范围内循环偏移:

  • 若加密时是Z向下偏移1位得到A,解密时A应该还原为Z,但你的代码会计算ord('A') - 1 = 64,输出@,不符合要求。
  • 非字母字符(如空格、*)无需偏移,你的代码会错误地对它们执行减法操作(虽然部分字符看起来结果正确,但逻辑不严谨,可能触发边界问题)。

修复方案

针对不同类型的字符分别处理,用模运算实现循环偏移:

n, encrypted_msg = input().split("#")
n = int(n)

for char in encrypted_msg:
    if char.isupper():
        # 大写字母循环解密
        decrypted = chr((ord(char) - ord('A') - n) % 26 + ord('A'))
    elif char.islower():
        # 小写字母循环解密
        decrypted = chr((ord(char) - ord('a') - n) % 26 + ord('a'))
    else:
        # 非字母字符直接保留
        decrypted = char
    print(decrypted, end='')

关键逻辑说明

  1. 模运算的作用:% 26会自动处理正负偏移的循环问题,比如:
    • 当(ord(char) - ord('A') - n)为负数时(如A偏移1位),-1 % 26 = 25,对应字母表的最后一位Z。
    • 对于负数偏移(如测试用例的-3),相当于反向偏移3位,模运算同样能正确计算。
  2. 非字母字符保留:空格、符号等直接输出,符合题目要求的消息格式。

测试验证

用附加测试用例-3#Jrf rf rnxz*测试:

  • J(大写):(74 - 65 - (-3)) %26 +65 = 12%26 +65 = 77 → M
  • r(小写):(114 -97 +3)%26 +97 = 20%26+97=117 → u
  • f(小写):(102-97+3)%26+97=8%26+97=105 → i
    最终输出Mui ui uqac*,符合凯撒密码解密逻辑。

内容的提问来源于stack exchange,提问作者Disobey1991

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:10:38