Caesar的密文——密码转换

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