PAT乙级1044

题目链接

https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696

题解

需要注意的几个点:

  • 题目有指出给出的数字范围是[0,169),即0至13*13,所以可知火星文不超两个单词:高位 低位

    这点我没注意(只是看了,没有细想)

  • 火星数字低位数字是tret时(即是13的整数倍时),不用输出这个tret。

    这一点样例中有暗示,我没完全体会出来,只是看到数字为13时不用输出tret

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// PAT BasicLevel 1044
// https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#define RADIX 13
using namespace std;

// 地球数字与火星数字的映射
string mars0[] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string mars1[] = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};

void earthToMars(string line); // 地球数字转火星数字,line是一行输入
void marsToEarth(string line); // 火星数字转地球数字,line是一行输入

int main()
{

int n; // n行输入
scanf("%d\n", &n); // scanf默认不读取换行符,加上\n会读取换行符,或者使用getchar()读取换行符
string line; // 保存一行

// 获取n行输入并进行相应处理
while (n--)
{
// 读取一行
getline(cin, line);

// 分别处理并输出结果
if (isdigit(line[0]))
{
earthToMars(line);
}
else
{
marsToEarth(line);
}
}

system("pause");
return 0;
}

void earthToMars(string line)
{
int num = stoi(line);
if (num >= RADIX)
{
if (num % RADIX == 0)
{
cout << mars1[num / RADIX] << endl;
}
else
{
cout << mars1[num / RADIX] << ' ' << mars0[num % RADIX] << endl;
}
}
else
{
cout << mars0[num] << endl;
}
}

void marsToEarth(string line)
{
stringstream ss(line); // 用户输入的一行
string str; // 用户输入的一个字符串
vector<string> strVec; // 保存各位火星数字
int num; // 最终求得的地球数字

// 读取字符串
while (ss >> str)
{
strVec.push_back(str);
}

// 一行有两个字符串,可表示[157,158]
if (strVec.size() == 2)
{
str = strVec.front();
// 高位数字
for (int i = 0; i < RADIX; ++i)
{
if (str == mars1[i])
{
num = RADIX * i;
break;
}
}

// 低位数字
str = strVec.back();
for (int i = 0; i < RADIX; ++i)
{
if (str == mars0[i])
{
num += i;
break;
}
}
}
// 一行有一个字符串,可表示[0,156]
else if (strVec.size() == 1)
{
str = strVec.front();
for (int i = 0; i < RADIX; ++i)
{
// 小于RADIX,即[0,12]
if (str == mars0[i])
{
num = i;
break;
}
// 大于等于RADIX,即[13,156]
if (str == mars1[i])
{
num = i * RADIX;
break;
}
}
}

printf("%d\n", num);
}

参考链接

https://blog.csdn.net/qq_22194315/article/details/54428678

https://blog.csdn.net/weixin_39345384/article/details/82317205


作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!