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='')
关键逻辑说明
- 模运算的作用:
% 26会自动处理正负偏移的循环问题,比如:- 当
(ord(char) - ord('A') - n)为负数时(如A偏移1位),-1 % 26 = 25,对应字母表的最后一位Z。 - 对于负数偏移(如测试用例的
-3),相当于反向偏移3位,模运算同样能正确计算。
- 当
- 非字母字符保留:空格、符号等直接输出,符合题目要求的消息格式。
测试验证
用附加测试用例-3#Jrf rf rnxz*测试:
J(大写):(74 - 65 - (-3)) %26 +65 = 12%26 +65 = 77→Mr(小写):(114 -97 +3)%26 +97 = 20%26+97=117→uf(小写):(102-97+3)%26+97=8%26+97=105→i
最终输出Mui ui uqac*,符合凯撒密码解密逻辑。
内容的提问来源于stack exchange,提问作者Disobey1991
相关产品推荐
相关产品推荐

