原題:
愷撒密碼
愷撒密碼是古羅馬愷撒大帝用來對軍事情報進行加解密的算法,它采用了替換方法對信息中的每一個英文字符循環替換為字母表序列中該字符后面的第三個字符,即,字母表的對應關系如下:
原文: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
假設用戶可能使用的輸入包含大小寫字母azAZ、空格和特殊符號,請編寫一個程序,對輸入字符串進行愷撒密碼加密,直接輸出結果,其中空格不用進行加密處理。使用input()獲得輸入。
輸入示例
python is good輸出示例
sbwkrq lv jrrg
答案:
【參考代碼】
s = input() t = "" for c in s: if 'a' <= c <= 'z': t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 ) elif 'A' <= c <= 'Z': t += chr( ord('A') + ((ord(c)-ord('A')) + 3 )%26 ) else: t += c print(t)愷撒密碼加密算法由很多種編寫方法,這是一種很直接的方法。
分析:
總體思路是利用ord()將字符轉換為整數Unicode碼,+3后用chr()返回Unicode字符,但是如果x,y,z的Unicode碼簡單加上3並不會回到a,b,c,而是溢出到下面的字符。
所以我們要將一個凱撒密碼的區間限定好,在這個區間內回環。
首先,這里用到了if 'a' <= c <= 'z':這種字符判斷,本質上也是利用Unicode編碼a-z與A-Z是連續區間這個性質進行判斷
其次,t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 )中的t +=用到了字符串可以用+的連接
ord(c)-ord('a')判斷c到"a"Unicode編碼的差值
(差值+3)對26取模很巧妙的限定在了"a"-"z"這個區間內.如果"a"-"w"字母加3后,差值在0-25內,取模就是原值;如果"x"-"z"字母差值加3后會大於26,取模會減去26,剩下的值即為到"a"的新差值
