题目要求
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 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<iostream>
#include<cstring>
using namespace std;
int main()
{
char s1[61],s2[61],s3[61],s4[61];
int num;
cin >> s1 >> s2 >> s3 >>s4;
for(int i=0;i<strlen(s1);i++)
{
if(s1[i]==s2[i]&& isupper(s1[i]) && s1[i]-65<8)
{
num=i;
switch (s1[i])
{
case 'A':
cout << "MON"<<' ';
break;
case 'B':
cout << "TUE"<<' ';
break;
case 'C':
cout << "WED"<<' ';
break;
case 'D':
cout << "THU"<<' ';
break;
case 'E':
cout << "FRI"<<' ';
break;
case 'F':
cout << "SAT"<<' ';
break;
case 'G':
cout << "SUN"<<' ';
break;
default:
break;
}
break;
}
}
for(int i=num+1;i<strlen(s1);i++)
{
if(s1[i]==s2[i]&& (isupper(s1[i])||isdigit(s1[i])) )
{
if(isdigit(s1[i]))
{
cout<<"0"<<s1[i]<<':';
break;
}
if(isupper(s1[i])&&s1[i]-65+10<24)
{
cout<<s1[i]-65+10<<':';
break;
}
}
}
for(int i=0;i<strlen(s3);i++)
{
if(s3[i]==s4[i]&& isalpha(s3[i]))
{
if(i<10) cout <<'0'<<i;
else cout <<i;
}
}
system("pause");
}
思路
多么浪漫的名字啊,福尔摩斯的约会,嘿嘿,不过俺也是有npy的人了,哈哈哈。
好吧,这道题呢,判定起来有很多小的细节,一开始我有三处判定错误,让我好找啊!
- 题目中代表星期的要求是:两字符串中第 1 对相同的大写英文字母,注意是大写字母,所以我们可以用
isupper(s1[i])
来判定是否为大写,另外除了大写之外有隐藏条件:因为只有星期一到星期日,所以超过这个范围的也需要剔除掉,我们加了s1[i]-65<8
,通过这个条件限定在7之中
for(int i=0;i<strlen(s1);i++)
{
if(s1[i]==s2[i]&& isupper(s1[i]) && s1[i]-65<8)
{
num=i;
switch (s1[i])
{
case 'A':
cout << "MON"<<' ';
break;
case 'B':
cout << "TUE"<<' ';
break;
case 'C':
cout << "WED"<<' ';
break;
case 'D':
cout << "THU"<<' ';
break;
case 'E':
cout << "FRI"<<' ';
break;
case 'F':
cout << "SAT"<<' ';
break;
case 'G':
cout << "SUN"<<' ';
break;
default:
break;
}
break;
}
}
- 题目中要求小时的要求是相同的字符和”于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示“,那么就需要判断为数字和大写字母,同样的大写字母范围有限制,这里使用
s1[i]-65+10<24
for(int i=num+1;i<strlen(s1);i++)
{
if(s1[i]==s2[i]&& (isupper(s1[i])||isdigit(s1[i])) )
{
if(isdigit(s1[i]))
{
cout<<"0"<<s1[i]<<':';
break;
}
if(isupper(s1[i])&&s1[i]-65+10<24)
{
cout<<s1[i]-65+10<<':';
break;
}
}
}
- 题目中分钟的要求是相同的英文字母出现在第n 个位置(从 0 开始计数)上,代表第 n分钟,那么众所周知,范围是0-59,那么就有
for(int i=0;i<strlen(s3);i++)
{
if(s3[i]==s4[i]&& isalpha(s3[i]))
{
if(i<10) cout <<'0'<<i;
else cout <<i;
}
}
好吧,这里不需要限制0-59,应该是题目默认了。
如此,完成!