【PAT】1061Dating (20 分)

46 篇文章 0 订阅
44 篇文章 0 订阅
  • 题目大意:破译密码:

    ​ 1. 前两个句子里第一个相同的大写英文字母在字母表的顺序为一周的第几天

    ​ 2. 前两个句子里第二个相同的字符为第几时(0-9/A-N)

    ​ 3. 后两个句子里第一个相同的英文字母的位置为第几秒

  • 思路:

    1. isupper()判断是不是大写字母
    2. 判断是不是0-9/A-N中的一个
    3. isalpha()判断是不是英文字母
  • 知识点:

    1. isupper()isdigit()等判断字符的函数在头文件cctype
      • 特别的,stoi()是c11特性,不需导入头文件
    2. 格式化时空处用0补全printf("%02:", hour);
  • 代码:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <cctype>
    using namespace std;
    
    int main(){
        string fir, sec, thi, fo;
        vector<string> weeks{"MON ", "TUE ", "WED ", "THU ", "FRI ", "SAT ", "SUN "};
        int i, j;
        cin >> fir >> sec >> thi >> fo;
        for(i = 0; i < min(fir.size(), sec.size()); i++){
            if(fir[i] == sec[i] && (fir[i] >= 'A' && fir[i] <= 'G')) {  // 第一个相同的大写字母必须在A-D
                printf("%s", weeks[fir[i] - 'A'].c_str());
                break;
            }
        }
        for(j = i + 1; j < min(fir.size(), sec.size()); j++){   // j = i + 1而不是i,因为检测到第一个大写字母时就跳出了
            int hour;
            if(fir[j] == sec[j] && ((fir[j] >= 'A' && fir[j] <= 'N') || isdigit(fir[j]))){  // 第二个相同的字符必须在0-9/A-N
                if(isdigit(fir[j]))
                    hour = fir[j] - '0';
                else
                    hour = fir[j] - 'A' + 10;
                printf("%02d:", hour);   // 空处用0补全
                break;
            }
        }
        for(i = 0; i < min(thi.size(), fo.size()); i++){
            if(thi[i] == fo[i] && isalpha(thi[i])) {
                printf("%02d", i);
                break;
            }
        }
        return 0;
    }
    
  • 总结

    1. 有两个要注意的点,判断星期和小时的部分要注意字母必须在A-D和0-9/A-N之间,不然计算没有意义。

    2. 这道题一开始做了一天一直报错,对着答案写还是报错,我就放了两天再来找原因,结果不小心把代码删了,就重新写了一遍。第二次写的时候顺畅很多,但是已经忘记之前卡在什么地方了。所以应该发现问题就解决问题的!这样才能马上发现问题,然后解决问题,下次不再犯!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值