ZZQ • 2年前
这题貌似都要求要做好久了,但貌似没什么人去做。
先看题目。
加急密文使用了“恺撒加密法”,所谓“恺撒加密法”,是指对于明文中的每个字母,用它后面的第t个字母代替。例如:当t=2时,字母A将变成C,字母B将变成D,……,字母Y将变成A,字母Z将变成B(设定字母表是循环的)。 这样一来,字母表: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 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 此规则下,明文例如Apple将加密为密文Crrng。 现在请你在不知道t值的情况下,把密文解密。加急密文使用了“恺撒加密法”,所谓“恺撒加密法”,是指对于明文中的每个字母,用它后面的第t个字母代替。例如:当t=2时,字母A将变成C,字母B将变成D,……,字母Y将变成A,字母Z将变成B(设定字母表是循环的)。 这样一来,字母表: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 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 此规则下,明文例如Apple将加密为密文Crrng。 现在请你在不知道t值的情况下,把密文解密。
貌似也只有英文可以这样搞这些奇怪的玩意。(bushi)
用的算法——枚举,模拟算法
我们可以定义几个简单且常见的单词(最好在句中,句首和句尾会受大小写和符号的影响)
代码如下(代码长度针不戳啊):
#include<bits/stdc++.h>
using namespace std;
char s[500010];
char c1[]= {" that "};//单词
char c2[]= {" this "};//单词
char c3[]= {" have "};//单词
int main() {
int Len;
for(Len=0; scanf("%c",&s[Len])!=EOF; Len++);//输入密文
for(int t=1; t<=26; t++) {//枚举(从+1到+26(即+0))
for(int i=0; i<Len; i++) {//转换
if(s[i]>='a' && s[i]<='z') {//小写字母转换
s[i]++;
if(s[i]>'z' ||s[i]<'a') s[i]-=26;
}
if(s[i]>='A' && s[i]<='Z') {//大写字母转换
s[i]++;
if(s[i]>'Z') s[i]-=26;
}
}
if(strstr(s,c1) || strstr(s,c2) || strstr(s,c3)) {//如果包含这些单词,则输出
cout<<s,exit(0);
}
}
return 0;
cout << "你学废了吗?" << endl;
}
评论: