凯撒密码_操作字符串

恺撒密码 I

 问题来自Python123 : https://python123.io/student/courses/0/groups/326/problems/programmings/299

描述

凯撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:

原文: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

密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26

上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26

假设用户可能使用的输入仅包含小写字母a~z和空格,请编写一个程序,对输入字符串进行凯撒密码加密,直接输出结果,其中空格不用进行加密处理。使用input()获得输入。

解答

注意这里各个字母的替换是异步的,所以不能使用p=p.replace(x,chr(ord(x)+3)),因为:
1.x不能按字母(a-z)遍历26次,which会造成隔三重复替换;
2.x不能按元素each in p遍历len(p)次,which会将重复出现的元素重复替换。
3.x也不能使用p[i],因为p[i]表示特定的元素,它的唯一属性就是它的值,与位置i无关,既若p[i]=='a',则p[i]与'a'等价。这种方法与each in p无区别。
以上三种对p进行的替换都会造成重复替换。所以,使用p=p.replace(x,y)无法达到预期效果。(注意使用replace方法做替换时不能单单写成p.replace('a','e'),因为p.replace()方法返回一个数值,但必须将这个值再次赋给p,即写成p=p.replace('a','e')才能使替换生效!)

最好的方法是直接改变每个p[i]值,改变len(p)次,即使用p[i]=这样能强制避免重复。然而字符串是不可变类型,即无法直接修改字符串的某一位字符。

程序

所以只能将字符串转换为列表后修改值,然后用join组成新字符串:

# 凯撒秘码1
p=input()
p1=list(p)
for i in range(len(p1)):
    if ord('a')<=ord(p[i])<=ord('z'):
        p1[i]=chr((ord(p1[i])+3-ord('a'))%26+ord('a'))
p2=''.join(p1)
print(p2)

 

实践很重要!

Python中修改字符串的几种方法参考:https://www.cnblogs.com/huangbiquan/p/7783057.html#3998943

posted @ 2018-06-15 13:23  永远怀着一颗学习的心  阅读(3790)  评论(0编辑  收藏  举报