1298:The Hardest Problem Ever:string类快速处理字符转换

题目翻译

凯撒大帝生活在一个充满危险和阴谋的时代。凯撒所面临的最艰难的处境就是要保住自己的性命。为了生存,他决定创造第一个密码。这个密码是如此令人难以置信的声音,没有人不知道它是如何工作的。

你是凯撒军队的副队长。你的工作是破译凯撒发出的信息并将其提供给你的将军。代码很简单。对于明文消息中的每个字母,将其向右移动5个位置以创建安全消息(即,如果字母是“A”,那么密文就是“F”)。由于您正在从Caesar的消息中创建纯文本,您将执行相反的操作

Cipher text 
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 

Plain text 
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”
  • 密码消息-包含从一到两百个字符(包括首尾)的一行,包括来自凯撒的一条消息
  • 结束行-一行,“ END”

最后的数据集后面是一行“ENDOFINPUT”。

输出

对于每个数据集,将只有一行输出。这是凯撒最初的信息。

思路分析

string类很好操作,使用getline(cin,str)读入一行字符(记住略去前导空格),然后对每个字符依次进行处理即可。

#include<iostream>
#include<map>
#include<string>
#include<string.h>
using namespace std;

int main() {
	string s1, s2, s3;
	while (cin >> s1 && s1 != "ENDOFINPUT") {
		if (s1 == "END")continue;
		cin.get();//略去前导回车
		getline(cin, s2);
		s3.assign(s2);
		for (unsigned i = 0; i < s2.size(); i++) {
			if (s2[i] >= 'A'&&s2[i] <= 'Z') {
				if (s2[i] >= 'A' + 5) s3[i] = s2[i] - 5;
				else s3[i] = s2[i] - 5 + 26;
			}
			else s3[i] = s2[i];
		}
		cout << s3 << endl;
	}
}
发布了186 篇原创文章 · 获赞 13 · 访问量 9306

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105214974
今日推荐