PAT B1044 火星数字(C++)

PAT甲级目录 | PAT乙级目录

题目描述

B1044 火星数字

解题思路

进制转换。通过字符串处理,先判断是地球数字还是火星数字,然后按照要求进行转换。

易错点

  • “tret” 长度为 4,可通过长度直接判断是否为 0.
  • 13 <=> “tam”; 26 <=> “hel”; …
    • 没有多余的部分。即 13 的倍数和小于 13 的数都是长度为 3 的字符串

也许陌生的知识点

  • isdigit(s[0])
    • 判断字符是否为数字
    • 需要头文件 cctype
  • s.substr(<截取部分的首地址>, <截取部分的长度>)
    • 截取字符串的一部分生成新的字符串
    • 需要头文件 string
  • while(j < 13 && l1[j] != s1) j++;
    • 查找元素在列表中的位置,找到了或找到列表末尾都将退出循环

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cctype>
#include <string>
using namespace std;
int main(){
int N;
string s, l1[] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string l2[] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
cin >> N;
getchar();
for(int i = 0; i < N; i++){
getline(cin, s);
if(isdigit(s[0])){ // 为地球数字
int num = stoi(s);
int a = num / 13, b = num % 13;
if(a == 0) cout << l1[b] << endl; //小于 13
else if(b == 0) cout << l2[a] << endl; // 为 13 的倍数
else cout << l2[a] + ' ' + l1[b] << endl; // 其他
}else{ // 为火星数字
string s1, s2;
int i = 0, j = 0, ans;
s1 = s.substr(0, 3);
if(s.length() == 4) ans = 0; // 为 0
else if(s.length() <= 3){ // 小于 13 或为 13 的倍数
while(j < 13 && l1[j] != s1) j++;
while(i < 13 && l2[i] != s1) i++;
ans = (i == 13) ? j : i * 13;
}else{ // 其他
s2 = s.substr(4, 3);
while(i < 13 && l2[i] != s1) i++;
while(j < 13 && l1[j] != s2) j++;
ans = i * 13 + j;
}
cout << ans << endl;
}
}
return 0;
}