必AC(求点赞)
2026-05-02 19:46:08
发布于:北京
1阅读
0回复
0点赞
🔍 题目给出的加密过程(从原文 → 密文)有三步:
左移三位:每个字母在字母表中向左移动3位
例如:d → a, e → b, c → z(循环左移)
逆序存储:整个字符串反转
大小写互换:大写变小写,小写变大写
所以:
明文 → (1) 左移3 → (2) 反转 → (3) 换大小写 → 密文
🔄 那么解密过程就是逆向操作,顺序也要反过来:
要从密文 → 明文,需按相反顺序执行相反操作:
先换大小写(因为加密最后一步是换大小写,所以解密第一步要换回来)
再反转字符串(抵消加密的第二步)
最后右移三位(因为加密是左移3,解密就要右移3,即 +3,注意循环)
✅ 具体步骤(解密算法)
给定密文 cipher:
大小写互换:遍历每个字符,大写→小写,小写→大写。
反转字符串。
每个字母右移3位(循环):
对于大写字母 'A'~'Z':(c - 'A' + 3) % 26 + 'A'
对于小写字母 'a'~'z':(c - 'a' + 3) % 26 + 'a'
注意:右移3位 = 加密时左移3的逆操作。
🔢 验证样例
输入密文:GSOOWFASOq
第1步:大小写互换
G → g
S → s
O → o
O → o
W → w
F → f
A → a
S → s
O → o
q → Q
得到:gsoowfasoQ
第2步:反转
Qosafwoosg
第3步:右移3位(每个字母)
| 字符 | 类型 | 原位置 | +3 | 新字符 |
|---|---|---|---|---|
| Q | 大写 | 16 | 19 | T |
| o | 小写 | 14 | 17 | r |
| s | 小写 | 18 | 21 | v |
| a | 小写 | 0 | 3 | d |
| f | 小写 | 5 | 8 | i |
| w | 小写 | 22 | 25 | z |
| o | 小写 | 14 | 17 | r |
| o | 小写 | 14 | 17 | r |
| s | 小写 | 18 | 21 | v |
| g | 小写 | 6 | 9 | j |
| 结果:Trvdizrrvj ✅ 与输出一致! |
不废话了,上代码!
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s;
cin >> s;
// 第1步:大小写互换
for (char &c : s) {
if (isupper(c)) {
c = tolower(c);
} else {
c = toupper(c);
}
}
// 第2步:反转
reverse(s.begin(), s.end());
// 第3步:每个字母右移3位(循环)
for (char &c : s) {
if (isupper(c)) {
c = (c - 'A' + 3) % 26 + 'A';
} else if (islower(c)) {
c = (c - 'a' + 3) % 26 + 'a';
}
}
cout << s << endl;
return 0;
}
这里空空如也








有帮助,赞一个