凯撒密码_操作字符串
恺撒密码 I
描述
凯撒密码是古罗马凯撒⼤帝⽤来对军事情报进⾏加解密的算法,它采⽤了替换⽅法对信息中的每⼀个英⽂字符循环替换为字母表序列中该字符后⾯的第三个字符,即,字母表的对应关系如下:
原⽂: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()获得输⼊。
解答
注意这⾥各个字母的替换是异步的,所以不能使⽤place(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进⾏的替换都会造成重复替换。所以,使⽤place(x,y)⽆法达到预期效果。(注意使⽤replace⽅法做替换时不能单单写成p.replace('a','e'),因为p.replace()⽅法返回⼀个数值,但必须将这个值再次赋给p,即写成place('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)
实践很重要!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。