1014 福尔摩斯的约会

来源:互联网 发布:用友软件版本号 编辑:程序博客网 时间:2024/06/08 07:57
// 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母'D',代表星期四;第2对相同的字符是'E',那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、以及大写字母A到N表示);后面两字符串第1对相同的英文字母's'出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。// // 输入格式:// // 输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。// // 输出格式:// // 在一行中输出约会的时间,格式为“DAY HH : MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。// 输入样例:// 3485djDkxh4hhGE// 2984akDfkkkkggEdsb// s&hgsfdk// d&Hyscvnm// // 输出样例:THU 14:04#include <stdio.h>#include <string.h>#include <ctype.h>// isupper()函数// 时间输出函数void PrintTime(int day, int hour, int min);int main(void){char str1[61];char str2[61];// 存储用户输入int day, hour, min;gets(str1);gets(str2);for (int i = 0; str1[i] != '\0'&&str2[i] != '\0'; i++)// 以i为下标来同时遍历两个字符串{if (str1[i] == str2[i] && str1[i] >= 'A' && str1[i] <= 'G')// 如果第一个相同大写字符找到,则day值确定,再接着分析hour值{day = str1[i] - 'A' + 1;for (int j = i + 1; str1[j] != '\0'&&str2[j] != '\0'; j++)// 分析hour值是从day之后的位置继续遍历两个字符串,以j为下标{if (str1[j] == str2[j] && str1[j] >= 'A' && str1[j] <= 'N')// 如果相同的是大写字母{hour = str1[j] - 'A' + 10;break;// hour确定,跳出循环}else if (str1[j] == str2[j] && str1[j] >= '0' && str1[j] <= '9')// 如果相同的是数字{hour = str1[j] - '0';break;// 跳出循环}}break;// 跳出循环}}gets(str1);gets(str2);for (int i = 0; str1[i] != '\0'&&str2[i] != '\0'; i++){if (str1[i] == str2[i] && isalpha(str1[i])){min = i;break;}}PrintTime(day, hour, min);return 0;}void PrintTime(int day, int hour, int min){switch (day){case 1:printf("MON ");break;case 2:printf("TUE ");break;case 3:printf("WED ");break;case 4:printf("THU ");break;case 5:printf("FRI ");break;case 6:printf("SAT ");break;case 7:printf("SUN ");break;default:break;}printf("%02d:%02d", hour, min);return;}// 这道简单的题我做起来是一波三折,让我不禁怀疑起我的智商了,别人做题是踩坑,相比起来,我更像是平地摔// 我平地摔的位置如下:// 1:第一次,我采用了char * pstr1, char * pstr2两个指针作为遍历指针,VS运行样例正常,然后,PAT告诉我,段错误,检查无果,遂改写(手贱没有保存当时写的码,看来很长一段时间内我是不会知道我错误的原因了)// 2:第二次,我用for (int i = 0; str1[i] != '\0'&&str2[i] != '\0'; i++)这种正常的方式进行遍历,样例运行也正确,但是不是满分。检查了很久,发现,代表日期的字母,只有在A到G之间才是有效的// 3:第三次,吸取了上次的教训,将日期的字母限制在A到G之间,把小时的字母限制在0到9与A到N之间,然后,还是有两个测试样例0分// 4:洗了个澡拉了坨屎,重新坐在电脑面前,把题重新读了一遍,发现,代表分钟的匹配项,必须是字母,即a到z及A到Z之间,改了之后。。。终于所有测试样例都能通过了。。// 这告诉我们:做这种编程题,一定要搞清楚题意。上了班之后,一定要搞清楚用户需求!!!!!地基打错了,楼盖的再漂亮,迟早都要拆。

0 0
原创粉丝点击