问题链接:HDU1048 The Hardest Problem Ever。入门训练题,用C语言编写程序。
以往,密码通信是一件重要的事情,是一项高技术的工作。不过译码的时候,通常是通过查密码本来实现的。这种方法依旧适用于现在这个计算机时代。
查表法仍然是一种好办法。有些程序员通过观察,找出编码规律,用程序来译码,程序没有通用性,不值得推荐和借鉴。
译码过程,使用字符指针来处理,是一种好办法。先计算字符串长度,再用长度值来控制循环处理是一种倒腾。
简洁版AC程序如下:
/* HDU1048 The Hardest Problem Ever(简洁版) */
#include <stdio.h>
#include <string.h>
char start[]= "START";
char end[]= "END";
char endofinput[]= "ENDOFINPUT";
char cipher[] = "VWXYZABCDEFGHIJKLMNOPQRSTU";
int main(void)
{
char s[1024], *p;
for(;;) {
gets(s);
// 判断开始:START
if(strcmp(s, start) == 0)
continue;
// 判断报文结束:END
if(strcmp(s, end) == 0)
continue;
// 判断结束:ENDOFINPUT
if(strcmp(s, endofinput) == 0)
break;
// 译码
p = s;
while(*p) {
if('A' <= *p && *p <='Z') {
*p = cipher[*p - 'A'];
}
p++;
}
// 输出结果
printf("%s\n", s);
}
return 0;
}
严格语法版AC程序如下:
/* HDU1048 The Hardest Problem Ever */
#include <stdio.h>
#include <string.h>
char start[]= "START";
char end[]= "END";
char endofinput[]= "ENDOFINPUT";
char cipher[] = "VWXYZABCDEFGHIJKLMNOPQRSTU";
int main(void)
{
char s[1024], *p;
for(;;) {
gets(s);
// 判断结束:ENDOFINPUT
if(strcmp(s, endofinput) == 0)
break;
// 判断开始:START
if(strcmp(s, start) == 0) {
// START之后,END之前,需要处理多行
for(;;) {
gets(s);
// 判断报文结束:END
if(strcmp(s, end) == 0)
break;
// 译码
p = s;
while(*p) {
if('A' <= *p && *p <='Z') {
*p = cipher[*p - 'A'];
}
p++;
}
// 输出结果
printf("%s\n", s);
}
}
}
return 0;
}