-
题目大意:破译密码:
1. 前两个句子里第一个相同的大写英文字母在字母表的顺序为一周的第几天
2. 前两个句子里第二个相同的字符为第几时(0-9/A-N)
3. 后两个句子里第一个相同的英文字母的位置为第几秒
-
思路:
- isupper()判断是不是大写字母
- 判断是不是0-9/A-N中的一个
- isalpha()判断是不是英文字母
-
知识点:
isupper()
、isdigit()
等判断字符的函数在头文件cctype
里- 特别的,
stoi()
是c11特性,不需导入头文件
- 特别的,
- 格式化时空处用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; }
-
总结
-
有两个要注意的点,判断星期和小时的部分要注意字母必须在A-D和0-9/A-N之间,不然计算没有意义。
-
这道题一开始做了一天一直报错,对着答案写还是报错,我就放了两天再来找原因,结果不小心把代码删了,就重新写了一遍。第二次写的时候顺畅很多,但是已经忘记之前卡在什么地方了。所以应该发现问题就解决问题的!这样才能马上发现问题,然后解决问题,下次不再犯!
-
【PAT】1061Dating (20 分)
最新推荐文章于 2021-09-08 20:03:05 发布