这段程序实现的是**“关键字替换表 + 解码”**的逻辑(不是加密,而是把密文解回明文)。关键字是 CSP
。流程与要点如下:
encoder
encoder[26]
初值:{'C','S','P',0,0,...,0}
,其余位置因是全局变量被零初始化。for
统计非零个数 k
,此处 k=3
(C、S、P 三个)。'A'..'Z'
依序枚举字母 x
,若 x
不在 encoder
里,就把它放到 encoder[k]
并 k++
。encoder
成为一张26字母的置换表,前缀是关键字 C,S,P
,随后按字母表顺序补齐未出现的字母。最终 encoder
(索引 i 对应明文字母 'A'+i
,值是密文字母):
decoder
decoder[encoder[i]-'A'] = i + 'A';
encoder[0]='C'
则 decoder['C']='A'
。i: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
明文: 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
密文: C S P A B D E F G H I J K L M N O Q R T U V W X Y Z
解密:D E A F G H I J K L M N O P Q C R S B T U V W X Y Z
(也就是:A→C, B→S, C→P, D→A, E→B, F→D, …, O→M, P→N, Q→O, R→Q, S→R, T→T, …, Z→Z)
cin >> st;
读入全大写字符串(假设只有 A–Z)。st[i]
:用 decoder[st[i]-'A']
还原成明文。CSP
C→A
, S→B
, P→C
,输出:ABC
。ABCD
A→D
, B→E
, C→F
, D→G
,输出:DEFG
。encoder
最终包含 26 个互不重复的字母 ⇒ 双射,因此一定可逆。decoder[st[i]-'A']
会越界/错误。实际使用应加判断或统一转大写。用关键字 CSP
构造一个“关键字字母表”(先放 C、S、P,再按字母表补齐剩余字母),然后用其逆映射把输入的密文转换回明文。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <cstdlib> // 这里其实没用到,可以去掉 #include <iostream> using namespace std; // 定义编码表(明文 → 密文),初始关键字是 C S P // 其余位置先填 0,后续再补齐 char encoder[26] = {'C','S','P',0}; // 定义解码表(密文 → 明文) char decoder[26]; // 输入字符串 string st; int main() { int k = 0; // 记录当前 encoder 已经填了多少个字母 // 统计 encoder[0..25] 中非零的个数 // 初始时就是 3(CSP) for (int i = 0; i < 26; i++) if (encoder[i] != 0) ++k; // 从 'A' 到 'Z' 遍历所有字母 for (char x = 'A'; x <= 'Z'; ++x) { bool flag = true; // 假设 x 没有出现过 // 检查 x 是否已经在 encoder 中 for (int i = 0; i < 26; ++i) if (encoder[i] == x) { flag = false; // 找到了,说明已经用过 break; } // 如果没出现过,就把它加入 encoder if (flag) { encoder[k] = x; ++k; } } // 构造 decoder 表(密文 → 明文) // encoder[i] 表示 "明文 'A'+i" 映射到的密文字母 // 所以 decoder[encoder[i]-'A'] = i+'A' // 就是“密文字符”映射回“明文字符” for (int i = 0; i < 26; ++i) decoder[ encoder[i] - 'A' ] = i + 'A'; // 输入一个大写字母串(密文) cin >> st; // 解码过程:把每个密文字母替换成对应的明文 for (int i = 0; i < st.length(); ++i) st[i] = decoder[ st[i] - 'A' ]; // 输出解码后的明文 cout << st << endl; return 0; } |