Python基础练习(五):破译密码

    xiaoxiao2022-07-05  153

    文章目录

    题目描述题目内容:输入格式:输出格式:输入样例1:输出样例1: 解题思路原始思路思路缺陷思路改进换种想法 解题代码思路一思路二

    题目描述

    题目内容:

    A国情报局抓获敌国间谍一名,从间谍身上搜出了若干密电,在严刑逼供之下,间谍说出了密电加密方法:将明文电报(仅由大写字母构成)中的所有字母均替换为字母表中向后看的第n个字母,如果超过Z,则从A继续数,这样就得到了密文,比如ATTACK,向后看第2个字母,就加密为CVVCFM。

    可还没等到间谍说出加密用的密钥(数字n),就被卧底开枪打死,间谍临死前在地板上画了BYE三个字母。

    情报局长看着一条条密电发了愁,但机智的你已经发现,原来间谍在告诉我们,所有密电的明文都以BYE结尾!

    请编写程序破译这些密电吧!

    输入格式:

    共一行字符串,全部由大写字母构成的密文。

    输出格式:

    共一行字符串,破译后的明文。

    输入样例1:

    JNTQZCZF

    输出样例1:

    IMSPYBYE

    时间限制:500ms内存限制:32000kb

    解题思路

    原始思路

    所有密电明文均以BYE结尾,因此我们可以利用该条件获知密钥n。(通过密文的最后三位字母中的任意一个均可获取,n即为对应位置的字母编码值的差值)如果明文超过“Z”,则从“A”继续数,这里我们可以借助其与26的差值得到。(英文字母总个数为26)将密文和明文分为两部分,最后三位和其他部分,分别计算即可 a = input().upper() b = "" n = ord('E')-ord(a[-1]) for i in a[:-3]: if ord(i)+n>ord("Z"): b += chr(ord(i)+n-26) else: b += chr(ord(i)+n) b += "BYE" print(b)

    思路缺陷

    在第一步中考虑不周,忽视了n的取值范围。举例说明,若a[-1]=“Z”,则n=-21,那么当ord(i)=65,即i="a"时,chr的值就已不是任何一个大写字母

    思路改进

    将n的取值分情况讨论,计算出n的精确值

    换种想法

    对于具有周期性的数列,取余数不失为一种好方法

    生成一个包含26个字母并且顺序排列的列表,或可简称为字母表(`・ω・´)按照题目要求,先求出密钥n利用密钥n求解密文移动后的位置,利用余数求解明文( 划重点 :由于此前已经生成新的字母表,范围在在[0,25]内,所以此时利用生成后的位置数对26(字母个数)取余极为方便)

    解题代码

    思路一

    a = input().upper() b = "" if a[-1]<='E': n = ord('E')-ord(a[-1]) else: n = 26+(ord('E')-ord(a[-1])) for i in a[:-3]: if ord(i)+n>ord("Z"): b += chr(ord(i)+n-26) else: b += chr(ord(i)+n) b += "BYE" print(b)

    思路二

    a = input().upper() l = [chr(i) for i in range(ord("A"),ord("Z")+1)] n = l.index('E')-l.index(s[-1]) b = "" for i in a[:-3]: b += l[(l.index(i) + n)%26] b += "BYE" print(b)
    最新回复(0)