朱利叶斯凯撒生活在危险和阴谋的时代。凯撒所面临的最艰难的局面就是让自己活着。为了让他活下来,他决定创造第一个密码之一。这个密码是如此令人难以置信的声音,没有人能够在不知道它是如何工作的情况下解决它。 你是凯撒军队的副队长。你的工作是破译凯撒发送的信息并提供给你的将军。代码很简单。对于明文消息中的每个字母,您将其向右移动五个位置以创建安全消息(即,如果字母为“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
只有字母在此密码中移位。任何非字母字符都应保持不变,并且所有字母字符都是大写字母。
Input此问题的输入将包含最多100个数据集的(非空)系列。每个数据集将根据以下描述进行格式化,并且没有空行分隔数据集。所有字符都是大写的。
单个数据集有3个组件:
起始行 - 单行,“START”
密码消息 - 包含一到两百个字符的单行,包括来自Caesar
End line 的单个消息- 单行“END”
在最终数据集之后将是单行“ENDOFINPUT”。
Output对于每个数据集,将只有一行输出。这是凯撒的原始信息。
Sample InputSTART NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT
Sample OutputIN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
这题目难度不大,但是输入还是有点需要注意的地方,它需要整行读取字符串,一般人可能就用gets() 读取,但是这个函数C++11已经不能使用了,而用getline又比较慢,其实scanf可以读取整行字符串,用scanf("%[^\n]",str) 可以读取整行字符串,这个语句的意思是读取’\n’外所有的字符串,^是指取补集,读到回车便停止读入。scanf更多用法可参考百度百科scanf的用法。 AC代码如下
#include <iostream> #include <string> #include <cstring> using namespace std; int main() { while(1) { string s, b; char a[205]; cin>>s; if(s == "ENDOFINPUT") break; getchar(); scanf("%[^\n]", a); int len = strlen(a); for(int i = 0; i < len; i++) { if(a[i] < 'A' || a[i] > 'Z') continue; a[i] = (a[i] - 'A' - 5 + 26) % 26 + 'A'; //+26是为了避免出现负数,取余数保证再0~25之内 } printf("%s\n", a); cin>>b; } return 0; }End