当题目区分大小写时......
2026-07-19 00:09:44
发布于:上海
8阅读
0回复
0点赞
话不多说,看题:
输入两个字符串,上面一个是密钥,下面一个是密文。题目要求通过所给的加密方法来得到原文,具体方法如下(已完成中译中):
密文的第k个字母在26字母表中的位置(a = 0,b = 1,c = 2......z = 25)减去密钥的的第k个字母在26字母表中的位置所得结果再换算成字母(a = 0,b = 1,c = 2......z = 25),以此类推。
当相减结果小于0时将结果加26再换算,当k大于密钥长度时则从头开始计算(如 密钥 长3,密文第4个字母将与密钥第1个字母做减法)。
需要注意的是,输出原文时须保持和密文大小写一致。
我先将密钥转为纯大写版和纯小写版,以便后面做ASCII码计算(重要技巧,不会建议学一下)。随后遍历密文,如果该字母为大写则使用纯大写版进行计算,反之使用纯小写版,最后输出明文。
完整AC代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
string k1,k2;
string s,ans;
cin >> k1 >> s;
int lens = s.size(),lenk = k1.size();
//纯大写版
for (int i = 0;i < lenk;i ++){
if (k1[i] >= 'A' && k1[i] <= 'Z') k2.push_back(k1[i]);
else k2.push_back(k1[i] - 'a' + 'A');
}
//纯小写版
for (int i = 0;i < lenk;i ++){
if (k1[i] >= 'A' && k1[i] <= 'Z') k1[i] = k1[i] - 'A' + 'a';
}
//cout << k1 << " " << k2 << "\n";
//这段调试程序我保留了,因我第一次提交时忘记删掉导致全WA,引以为戒
for (int i = 0;i < lens;i ++){
//当前字母为小写时
if (s[i] >= 'a' && s[i] <= 'z') {
if (s[i] - k1[i%lenk] >= 0) ans.push_back(s[i] - k1[i%lenk] + 97);
else ans.push_back(s[i] - k1[i%lenk] + 97 + 26);
}
//当前字母为大写时
else {
if (s[i] - k2[i%lenk] >= 0) ans.push_back(s[i] - k2[i%lenk] + 65);
else ans.push_back(s[i] - k2[i%lenk] + 65 + 26);
}
}
cout << ans;
}
补充一个彩蛋:
"CompleteVictory" 意为"完全胜利",而 "Wherethereisawillthereisaway" (Where there is a will, there is a way) 意为 "有志者事竟成"。
在此送给大家这两句话!
全部评论 1
给个赞吧,谢谢!
2026-07-19 来自 上海
1






有帮助,赞一个