Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是Caesar 军团中的一名军官,需要把Caesar 发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之前的第n个字母替换(如n=5,消息原文中的每个字母F都分别替换成字母A,n由键盘输入,在密码的末尾),其他字符不变,并且消息原文的所有字母都是大写的。 以下为n=5时的密码对应表。
密码字母: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
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U。
输入格式:
输入一条消息,最后一个数字为密钥。
输出格式:
输出破译后的信息。
输入样例:
RTAZ STB!5
输出样例:
MOVU NOW!
输入样例:
JVTL VU!7
输出样例:
COME ON!
代码如下
#include<iostream>
using namespace std;
int main()
{
char text[256], ch;
int len = 0, cipher_num, i, new_pos;
/*读入密文和密匙*/
ch = cin.get();
while (ch != '\n' && len < 256) {
text[len] = ch;
len++;
ch = cin.get();
}
text[len] = '\0';
if (len == 0) {cout << "invalid text" << endl; return 0;}
cipher_num = text[len - 1] - '0'; /*获取密码移位的位数*/
for(i = 0; i < len - 2; i++) { /*解密*/
if (text[i] < 'A' || text[i] > 'Z') continue;
new_pos = text[i] - 'A' - cipher_num;
text[i] = (new_pos < 0 ? new_pos + 26: new_pos) + 'A';
}
text[len - 1] = '\0'; /*去除密匙字符*/
cout << text << endl;
return 0;
}
参考 https://blog.csdn.net/weixin_46386047/article/details/126686752