问题链接: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 ", 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 ", s); } } } return 0; }