008
- mod:是单词
modulus
的缩写n.模数
因此题目就暗示了,原文字符是通过+3
后再对26
取余,得到的密文字符。故这里的循环变量也是p
。
不妨我们通过一个实例来说明一下:
- 假设键入的
p
为'k'
,通过内置函数ord()
来获取对应的ASCII码值,然后再减去基准值ord("a")
,进而得到字母'k'
在字母表中的顺序。
>>> ord('k')
107
>>> ord('k')-ord("a")
10
- 用该顺序
+3
以满足凯撒大帝的加密条件(C = (P+3) mod 26)
。此时的ACSII码a
再对26
取余,显然得到的仍然是a
,这里的数学知识就是:如果被除数小于除数,则余数等于被除数。 反之亦然,如果被除数大于除数,则余数等于被除数减去除数乘商。
>>> ord('k')-ord("a")+3
13
>>>13%26
13
- 此时的ACSII码是
13
,但是直接使用chr()
是不对的,原因是小写字母是从97
开始的,而大写字母是从65
开始的,因此这里需要加基准值ord("a")
,因此正确的是13 + ord("a") = 110
。
>>>ord(13)
'\r'
>>>chr(ord('a')+13)
'n'
下面先分析小写字母:
print(chr(ord("a")+(ord(p)-ord("a")+3)%26),end="")
(ord(p)-ord("a")+3)
:是先获取键入的原文字符,进行加密后的字母顺序。(ord(p)-ord("a")+3)%26
:通过取余的方式,巧妙的解决了字母xyz
对应的abc
的处理方法。ord("a")+(ord(p)-ord("a")+3)%26
:加上基准值ord("a")
,获得加密后的ACSII码顺序。chr(ord("a")+(ord(p)-ord("a")+3)%26),end=""
:最后在使用chr()
方法,转化为字母,并将end
参数改为空(默认是换行符)。
大写的字母同理,换汤不换药。
输出字母之外的原字符不同想的那么复杂:
else:
print(p,end="")
- 但是需要注意的是,不能把这里的
p
换成intxt
,原因是:字母之外的原字符如果是后者,会由于键入个数,受for循环的影响,从而产生输出的冗余。而如果是前者,仅仅会输出循环变量,不会产生冗余。
e.g.:
# print(intxt,end='')
请输入明文:;[]'
;[]';[]';[]';[]'
>>>
# print(p,end='')
请输入明文:;[]'
;[]'
>>>
总代码:
intxt = input("请输入明文:")
for p in intxt:
if "a" <= p <= "z":
print(chr(ord("a")+(ord(p)-ord("a")+3)%26),end="")
elif "A" <= p <= "Z":
print(chr(ord("A")+(ord(p)-ord("A")+3)%26),end="")
else:
print(p,end="")