PAT (Basic Level) Practice题解 1014 福尔摩斯的约会 [C语言实现]

题目

原题链接
在这里插入图片描述

思路

如果不是题目描述地太模糊了,这题不难。
我翻译一下题目:

  • 确定星期:前两个字符串中位置相同且字符相同的第一个大写字母,并且是[A-G]
  • 确定小时:接星期的字符向后查找,位置相同的下一个相同的字符,并且是数字[0-9],或大写字母[A-N]
  • 确定分钟:后两个字符串中位于相同位置且相同的第一个字母(不论大小写)

涉及到具体的代码,要用到ASCII码的知识,比较ASCII码,就能确定字符的范围了。

  • 注意要点1:小时数如果不满两位数,要显示两位数,用%02d表示
  • 注意要点2:指针字符串数组讲解
    例如
    char* DAYS[]={"MON","TUS","WED","THU","FRI","SAT","SUN"};
    
    这是一个指向数组的指针组,每个指针指向一个字符串(数组),DAYS[0]是字符串"MON"

代码

#include <stdio.h>

/*
确定星期:前两个字符串中位置相同且字符相同的第一个大写字母,并且应处于[A-G]
确定小时:接星期的字符向后查找,位置相同的下一个相同的字符,并且处于[0-9A-N]
确定分钟:后两个字符串中位于相同位置且相同的第一个字母
*/
int main()
{
    char str1[61],str2[61],str3[61],str4[61];
    scanf("%s %s %s %s",str1,str2,str3,str4);
    int DAY;//用作计数,星期几-1
    char* DAYS[]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
    //位置相同且字符相同,ASCII码介于'A'----'G',解密星期几
    for(DAY = 0; str1[DAY] && str2[DAY]; DAY++)
    {
        //ASCII码介于'A'----'G'
        if(str1[DAY] == str2[DAY] && str1[DAY] >= 'A' && str1[DAY] <= 'G')
        {
            printf("%s",DAYS[ str1[DAY] - 'A' ]);//ASCII码计算出正确的下标
            break;
        }
    }

    //下一对位置相同且字符相同,ASCII码介于0-9,A-N,解密小时数
    int HH;
    for(HH = DAY + 1; str1[HH] && str2[HH]; HH++)
    {
        if(str1[HH] == str2[HH])
        {
            if(str1[HH] >= '0' && str1[HH] <= '9')
            {
                //%02d是为了个位数也输出两位,例如01 05 09之类的,格式问题
                printf(" %02d",str1[HH] - '0');//char型数组,里面的数字是ASCII码,要减'0'
                break;//注意上面有个空格,格式问题
            }
            if(str1[HH] >= 'A' && str1[HH] <= 'N')
            {
                printf(" %02d",str1[HH] - 'A' + 10);//A从10开始的,所以减'A'+10
                break;//注意上面有个空格,格式问题
            }
        }
    }

    //str34字符串中,位置相同,字符相同,且是字母,解密分钟数
    int MM;
    for(MM = 0; str3[MM] && str4[MM]; MM++)
    {
        if(str3[MM] == str4[MM] && str3[MM] >= 'A' && str3[MM] <= 'z')
        {
            printf(":%02d",MM);
            break;//注意上面有个冒号,格式问题
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值