恺撒密码的C和Python实现

Python123上的代码练习题,觉得不错,所以根据所学的C和Python知识通过代码实现。

描述

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

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

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

假设用户可能使用的输入包含大小写字母a~z,A~Z、空格和特殊符号,请编写一个程序,对输入字符串进行恺撒密码加密,直接输出结果,其中空格不用进行加密处理。

C代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
int k;
scanf("%d", &k);
getchar(); #scanf会把换行符保留在缓冲区,此举可避免换行符被算在原文内

char c = getchar();
while (c != '\n') {
if (c >= 'a' && c <= 'z') {
c = 'a' + (c - 'a' + k) % 26;
} else if (c >= 'A' && c <= 'Z') {
c = 'A' + (c - 'A' + k) % 26;
}
printf("%c", c);
c = getchar();
}
return 0;
}

在C语言中,字符本身就是以对应的ASCii值保存的,所以无需转换就可以与整数值相运算。

Python代码实现

方案一

1
2
3
4
5
6
7
8
9
plain = input()
k = input()

for i in plain:
if 'a' <= i <= 'z' or 'A' <= i <= 'Z':
i = chr(ord(i) + eval(k))
if not ('a' <= i <= 'z' or 'A' <= i <= 'Z'):
i = chr(ord(i) - 26)
print(i, end="")

方案二

1
2
3
4
5
6
7
8
9
10
11
12
plain = input()
k = input()
secret = ""

for c in plain:
if 'a' <= c <= 'z':
c= chr(ord('a') + (ord(c) - ord('a') + eval(k)) % 26)
elif 'A' <= c <= 'Z':
c = chr(ord('A') + (ord(c) - ord('A') + eval(k)) % 26)
secret += c

print(secret)

在Python中,ord([char])会把字符i转换为对应的unicode编码值,而chr([int])会把整数值转换为相应的unicode字符。

客官,请随意~~
  • 本文作者: Brayn
  • 发布时间: 2019年01月19日 - 14:01
  • 最后更新: 2019年01月19日 - 20:01
  • 本文链接: https://brayn.top/posts/4746/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!