卫卿宸汐 2022-11-28 12:33 采纳率: 50%
浏览 118
已结题

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!

  • 写回答

2条回答 默认 最新

  • X-道至简 2022-11-29 19:47
    关注

    代码如下

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 赞助了问题酬金15元 11月28日
  • 创建了问题 11月28日