凯撒密码(Caesar cipher)程序解码时y、z字符输出错误求解
问题根源
你的decode函数的边界调整逻辑完全错误,和实际需要的判断条件相反:
- 加密时是给字符ASCII值加移位key,超出字母表上限(z/Z的ASCII值)时才需要减26回绕,你这块的逻辑是对的
- 解密时是给字符ASCII值减移位key,此时只会出现*低于字母表下限(a/A的ASCII值)*的情况,你仍然沿用了加密时判断是否超出上限的逻辑,该调整条件永远不会触发,小于a/A的ASCII值会直接转换为字母以外的符号,就出现了你遇到的y、z解密后输出_、`的问题。
拿你测试用的输入举例:
加密后的小写b对应ASCII值98,减移位值3得到95,95小于小写a的ASCII值97,你原来的判断条件是cipher_value > ord("z"),显然不成立,不会做任何调整,95对应的字符就是下划线,和你的测试结果一致。
修正后的decode函数代码
def decode(message, key): """传入加密后的字符串,返回解密后的原始字符串""" decoded_message = "" for char in message: if char.isalpha(): cipher_value = ord(char) - key if char.islower() and cipher_value < ord("a"): # 小写字母低于a时加26回绕到字母表末尾 cipher_value = cipher_value + 26 if char.isupper() and cipher_value < ord("A"): # 大写字母低于A时加26回绕到字母表末尾 cipher_value = cipher_value + 26 decoded_message += chr(cipher_value) else: decoded_message += char return decoded_message
修正后再用你的测试用例运行,解密bcbc就会正确返回原始的yzyz。
内容的提问来源于stack exchange,提问作者bbrichardbb
相关产品推荐
相关产品推荐

