PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会

文章描述了一个基于字符串匹配的解码问题,类似于福尔摩斯接收到的加密信息。输入是四对字符串,目标是找出代表星期和时间的编码,并解码成日期时间格式。解码规则涉及字母和数字的特定对应关系,程序需要处理各种限制条件来找到正确答案。

大侦探福尔摩斯接到一张奇怪的字条:

我们约会吧! 
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

思路 

用gets()获取需要匹配的字符串,然后用一个指针循环对比。

1、第一次匹配时,注意限制条件为大写英文字母,小写不行;

2、第二次匹配时,注意限制条件为0-9或者A-N(必须大写,小写不行);

3、重新获取两字符串再匹配一次,注意限制条件为英文字母,即a-z或者A-A ;

4、根据输出样例,时间输出时,10以内前面带一个0,用%02d控制即可。


AC代码

//这一题注意匹配字母的各种限制要求即可
#include<stdio.h>
#include<string.h>
void day(char n){
    char p[7][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
    printf("%s ",p[n-'A']);//注意空格
}
void hour(char n){
    char p[24][3]={"00","01","02","03","04","05","06","07","08","09",
                    "10","11","12","13","14","15","16","17","18","19",
                    "20","21","22","23"};
    if(n>='0'&&n<='9')printf("%s:",p[n-'0']);//注意冒号
    if(n>='A'&&n<='N')printf("%s:",p[n-'A'+10]);
}
int main(){
    int flag=0;
    char s[61],p[61];
    gets(s);
    gets(p);
    for(int i=0;i<strlen(s)<strlen(p)?strlen(s):strlen(p);i++){
        if(s[i]==p[i]&&s[i]>='A'&&s[i]<='G'&&flag==0){//注意限制条件,flag控制匹配的次数
            day(s[i]);
            flag=1;
            continue;
        }
        if(s[i]==p[i]&&((s[i]>='A'&&s[i]<='N')||(s[i]>='0'&&s[i]<='9'))&&flag==1){//注意限制条件,flag控制匹配次数
            hour(s[i]);
            break;
        }
    }
    gets(s);
    gets(p);
    for(int i=0;i<strlen(s)<strlen(p)?strlen(s):strlen(p);i++){
        if(s[i]==p[i]&&((s[i]>='A'&&s[i]<='Z')||(s[i]>='a'&&s[i]<='z'))){//注意限制条件
            printf("%02d",i);//注意个位数时带0
            break;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dragon_dd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值