大侦探福尔摩斯接到一张奇怪的字条:
我们约会吧!
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
解题思想:这题总体来说是有点小变态的,参数较多,条件较多,其实思路不是很难,但是把这些东西糅杂在一起就很头疼了。那么这题不出意外也是一堆测试点无法通过,题目给出的样例可以正常输出,但是部分测试点无法通过,说一下思路。
题目中可以看做三个变量:星期几,小时,分钟。
这里星期几我用了一个函数通过switch选择语句来完成。先将前两个数组进行逐一比较,第一个相同的字符必须是大写字母,所以这一点需要加入判断条件中。将第一次比较相同的数组内容存放入m1,再开始第二次比较。
第二次比较就只需要字符相同即可,按照题目要求,可以是字母,也可以是数字,第二次比较的结果代表时间的小时,这是我设置的第二个函数time,如果相同的值大于10,那么是通过ABCD表示的,所以这里我又用到了一个switch语句。
第三次比较则是从第三和第四个数组中进行比较,需要字母相同,所以条件字母得加入比较判断中,这次比较需要记录下的不是相等的数组中的内容,而是数组的下标,所以注意不要弄错了。
还有一个点就是,时间中的小时和分钟为个位数时,前面需要加0,所以需要分为一位数的情况和两位数的情况,一位数+0,两位数直接输出就行了。
本体思路大概就是这样吧,写太多了怕读者也懒得看,其他请看代码吧。
#include<stdio.h>
#include<string.h>
void time(char b)//这个函数是用来输出小时的,不同字母对应不同的时间
{
switch(b)
{
case 'A':
printf("10:");
break;
case 'B':
printf("11:");
break;
case 'C':
printf("12:");
break;
case 'D':
printf("13:");
break;
case 'E':
printf("14:");
break;
case 'F':
printf("15:");
break;
case 'G':
printf("16:");
break;
case 'H':
printf("17:");
break;
case 'I':
printf("18:");
break;
case 'J':
printf("19:");
break;
case 'K':
printf("20:");
break;
case 'L':
printf("21:");
break;
case 'M':
printf("22:");
break;
case 'N':
printf("23:");
break;
default:
break;
}
}
void day(char a)//这个函数用来输出星期几
{
switch(a)
{
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;
default :
break;
}
}
int main()
{
int n,i;
int ls=1;//ls变量用来区分第一第二两个数组中比较时,哪个是第一个相等的,哪个是第二个相等的
char m1,m2;
char a[61];
char b[61];
char c[61];
char d[61];
scanf("%s",a);
scanf("%s",b);
scanf("%s",c);
scanf("%s",d);
//这里需要用strlen函数来求一下比较的两个数组的长度,循环的次数肯定要以长度短的那个为界限
if(strlen(a)<strlen(b))
n=strlen(a);
else
n=strlen(b);
for(i=0;i<n;i++)
{
if(a[i]==b[i]&&a[i]>='A'&&a[i]<='Z'&&ls==1)//第一次相等,限制必须是大写字母
{
m1=a[i];
ls=2;
}
else if(a[i]==b[i]&&ls==2)//第二次相等没有限制,是字符均可
{
m2=a[i];
}
}
day(m1);//输出星期几
if(m2>=0&&m2<=9)//这是小时为个位数的情况,此时前面得+0
{
printf("0");
printf("%c:",m2);
}
else if(m2>='A'&&m2<='N')//这是小时为两位数的情况
{
time(m2);
}
if(strlen(c)<strlen(d))//和上面的意思一样
n=strlen(c);
else
n=strlen(d);
for(i=0;i<n;i++)
{
if(c[i]==d[i]&&c[i]>='a'&&c[i]<='z')
{
if(i<=9)
printf("0%d",i);
else
printf("%d",i);
}
}
return 0;
}