发布题解(MSG)

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;
}

评论:

珍爱生命,远离抄袭!!!


ZZQ  •  2年前

(只是想请管理员通过一下)


ZZQ  •  2年前


ZZQ  •  2年前


ZZQ  •  2年前