题目
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧!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
题干信息整理
第一和第二个字符串
- 第一个相同字符,且属于{ A , B , C , D , E , F , G },分别代表星期一到星期日;
- 第二个相同字符,且属于{0 ~ 9,A ~ N},分别代表一天24个小时。
第三和第四个字符串
3. 第i个相同“英文字符”代表第i分钟。
陷阱
- 时和分均是2位数;
- 第三和第四个字符串相同的必须是英文字符。
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[4][61];
for(int i=0;i<4;i++)
scanf("%s",str[i]);
char code[3]; //记录相同的字符,实际两个char空间即可
int j=0;
int k=0;
while(str[0][j]!='\0'&&str[1][j]!='\0')
{
if(str[0][j]==str[1][j]&&str[0][j]<='G'&&str[0][j]>='A') //A~G
{
code[k++]=str[0][j];
j++;
break; //因为条件不同,找到第一个相同即可跳出循环
}
j++;
}
while(str[0][j]!='\0'&&str[1][j]!='\0')
{
if(str[0][j]==str[1][j]&&(str[0][j]<='9'&&str[0][j]>='0'||str[0][j]<='N'&&str[0][j]>='A'))
//0~9或A~N
{
code[k++]=str[0][j];
break;
}
j++;
}
j=0;
while(str[2][j]!='\0'&&str[3][j]!='\0')
{
if(str[2][j]==str[3][j]&&(str[2][j]<='z'&&str[2][j]>='a'||str[2][j]<='Z'&&str[2][j]>='A'))
break;
j++;
}
switch(code[0])
{
case 'A': printf("MON "); break;
case 'B': printf("TUE "); break;
case 'C': printf("WED "); break;
case 'D': printf("THU "); break;
case 'E': printf("FRI "); break;
case 'F': printf("SAT "); break;
case 'G': printf("SUN "); break;
}
if(code[1]>='0'&&code[1]<='9') //此处可以统一转换成int型用%02d处理
printf("0%c:",code[1]);
else if(code[1]>='A'&&code[1]<='N')
printf("%d:",10+code[1]-'A');
printf("%02d",j); //j保存了是字符串的第几个位置
return 0;
}