ACM-最难的问题(字符串处理)

来源:互联网 发布:淘宝溢价是什么意思 编辑:程序博客网 时间:2024/05/21 15:00

问题描述

        Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是 Caesar 军团中的一名军官,需要把 Caesar 发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第 5个字母替换(例如:消息原文中的每个字母 A 都分别替换成字母 F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文中的字母对应关系如下。

密码字母: 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

输入数据

最多不超过 100 个数据集组成。每个数据集由 3 部分组成
起始行: START
密码消息:由 1 到 200 个字符组成一行,表示 Caesar 发出的一条消息
结束行: END
在最后一个数据集之后,是另一行: ENDOFINPUT

输出要求

每个数据集对应一行,是Caesar的原始消息。

输入样例

STARTNS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJXENDSTARTN BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NSWTRJENDSTARTIFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJENDENDOFINPUT

输出样例

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSESI WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROMEDANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

问题分析

        此问题非常简单,将密码消息中的每个字母分别进行相应的变换即可。关键是识别输入数据中的消息行、读入消息行的数据。输入数据中,每个消息行包括多个单词、以及若干个标点符号。

(1) scanf函数输入字符串时,每个字符串中不能有空格。每读到单词"START",则表示下面读到的是一个消息行中的单词,直到读到单词"END"为止。
(2) 对消息解密时,需要将表示消息中单词的字符串作为普通的数组,依次变换其中的每个字母。

解决方案

        读到消息行之后,通过 scanf 读如其中的每个单词,分别解密。将解密后的单词按照原来的顺序,拼接成一条完整的消息。需要用到下列几个字符串处理函数:

strcmp:识别输入数据中消息行的开始和结束strlen:计算加密消息中每个单词的长度strcat:将解密后的单词重新拼接成一条完整的消息

参考程序

#include <iostream>#include <cstdio> using namespace std;void decipher(char message[]){char plain[27]="VWXYZABCDEFGHIJKLMNOPQRSTU";char cipherEnd[201];int i,cipherLen;gets(message);//获取密码 cipherLen = strlen(message);for(i=0;i<cipherLen;i++){//将密码逐个字符替换 if(message[i]>='A'&&message[i]<='Z'){message[i]=plain[message[i]-'A'];}}//获取结尾字符串 "ENDOFINPUT" gets(cipherEnd);}int main(){char message[201];gets(message);//当字符串不为 "START" 时 结束程序 while(strcmp(message,"START")==0){decipher(message);//处理字符串 cout<<message<<endl;gets(message);}return 0;}

0 0
原创粉丝点击