HDU1048 The Hardest Problem Ever(AC代码 + scanf小技巧)

  • 题目

朱利叶斯凯撒生活在危险和阴谋的时代。凯撒所面临的最艰难的局面就是让自己活着。为了让他活下来,他决定创造第一个密码之一。这个密码是如此令人难以置信的声音,没有人能够在不知道它是如何工作的情况下解决它。
你是凯撒军队的副队长。你的工作是破译凯撒发送的信息并提供给你的将军。代码很简单。对于明文消息中的每个字母,您将其向右移动五个位置以创建安全消息(即,如果字母为“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 Input

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

  • Sample Output

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

这题目难度不大,但是输入还是有点需要注意的地方,它需要整行读取字符串,一般人可能就用gets() 读取,但是这个函数C++11已经不能使用了,而用getline又比较慢,其实scanf可以读取整行字符串,用scanf("%[^\n]",str) 可以读取整行字符串,这个语句的意思是读取’\n’外所有的字符串,^是指取补集,读到回车便停止读入。scanf更多用法可参考百度百科scanf的用法。
AC代码如下

#include 
#include 
#include 
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

你可能感兴趣的:(题解,字符串,c++,scanf)