恺撒Caesar密码编程题-编程练习题(100)
⽬录
问题:
4.【问题描述】
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 的原始消息。
【样例输⼊】
START
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
【样例输出】
IN 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
分析:
问题主要是如何将密码解密为原⽂?将密码的字母都换为之前第5位字母就ok,但是A B C D E需要额外注意,其对应V W X Y Z这五个字母。另外还有空格,标点符号不⽤处理。最后就是⽤什么数据结构存储信息了,我这⾥使⽤string字符串存储。
C++代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string caeserPwd;      //凯撒密码字符串
string abcde = "VWXYZ"; //置换ABCDE使⽤字符串
string over;            //获取END字符串专⽤
int len = 0;            //存储凯撒密码长度
while(1)                //直到输⼊ENDOFINPUT结束循环
{
getline(cin,caeserPwd);      //获取⼀⾏密码,注意要使⽤getline()
if("START" == caeserPwd)      //如果是起始⾏标志则执⾏下列代码
{
getline(cin,caeserPwd);  //获取第⼆⾏密码,这⼀⾏就是密码体了。
len = caeserPwd.length(); //计算出密码长度
for(int i=0; i<len; i++)
{
密码字符串是什么
if(caeserPwd[i] >= 'A' && caeserPwd[i] <= 'E')  //如果是A-E之间的则置换为VWXYZ
caeserPwd[i] = abcde[caeserPwd[i] - 'A'];
else if(caeserPwd[i] >'E' && caeserPwd[i] <='Z') //如果是E-Z之间的字母则直接置换为其前边第五个字母
caeserPwd[i] = caeserPwd[i] - 5;
}
getline(cin,over);              //获取密码结束⾏字符串
if("END" == over)              //如果是END结束标志,则输出密码原⽂
cout << caeserPwd << endl;
}else if("ENDOFINPUT" == caeserPwd) //如果是结束输⼊标志ENDOFINPUT则结束程序
{
break;
}
}
return 0;
}
总结:
在CCF-CSP中⼀般第三题为字符串处理题⽬,⽽且是⾮常复杂的处理,所以最好使⽤string类来处理,string类提供了⾮常多⽽且⾮常⽅便的处理字符串函数。要注意的⼀点是⼀定要使⽤getline()函数获取字符串,不能使⽤cin。这两个的区别就是cin>>会⾃动过滤掉不可见字符(如空格回车 tab等),遇到空格、回车等会结束获取输⼊的字符串,后⾯的字符串会过滤掉(存放在输⼊流中)。如果后⾯还需要输⼊字符串,则会从前⾯存放的字符串开始获取。⽽getline()属于string类的函数,使⽤时需包含头⽂件#include<string>。格式为:
getline(cin,string s),接收⼀个字符串,可以接收空格、回车等,会获取整⾏内容。另⼀题也是,如果不使⽤getline()是拿不到满分的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。