// 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 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之间,改了之后。。。终于所有测试样例都能通过了。。 // 这告诉我们:做这种编程题,一定要搞清楚题意。上了班之后,一定要搞清楚用户需求!!!!!地基打错了,楼盖的再漂亮,迟早都要拆。