PAT-B 真题- 1044. 火星数字

发布于 / PAT-乙级 / 0 条评论

原题干:

火星人是以13进制计数的:

  • 地球人的0被火星人称为tret。

  • 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。

  • 火星人将进位以后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。

例如地球人的数字"29"翻译成火星文就是"hel mar";而火星文"elo nov"对应地球数字"115"。为了方便交流,请你编写程序实现地球和火星数字之间的互译。

输入格式:

输入第一行给出一个正整数N(<100),随后N行,每行给出一个[0, 169)区间内的数字 —— 或者是地球文,或者是火星文。

输出格式:

对应输入的每一行,在一行中输出翻译后的另一种语言的数字。

输入样例:

4
29
5
elo nov
tam

输出样例:

hel mar
may
115
13

这道题涉及到了进制转换等等内容,但是通过观察可以发现题目中数的范围并不多,[0, 169),所以这里我先进行了打表,将0到168的火星文都计算出来,然后与数字建立映射,这样输入的时候只需要判断输入的是否是数字,然后直接把map容器已经打好的"表"输出即可。

这里应注意读取时应读入一整行数据,因为中间有空格。所以应使用getline,另外在输入第一行正整数后应用getline吸收一个换行符,否则while循环中第一次的getline会读入一个空行。

代码如下:

#include <map>
#include <string>
#include <iostream>
#include <cmath>

using namespace std;

map<string, int> mars_num;
map<int, string> num_mars;
string g[] = {"", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string s[] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};

void init(){    //打表
    int num = 0;    //地球数字
    string mars_str, middle;    //mars_str为每次的火星数字,middle判断中间是否有空格
    for(int i = 0; i <= 12; i++){   //十位
        for(int j = 0; j <= 12; j++){    //个位
            middle = (num >= 13 && num % 13) ? " " : "";    //判断是否有中间的空格
            mars_str = s[i] + middle + g[j];    //生成火星数字
            mars_num[mars_str] = num;   //写入map中
            num_mars[num] = mars_str;
            num++;
        }
    }
    num_mars[0] = "tret";   //0要特殊考虑
    mars_num["tret"] = 0;
}

int str_num(string num){    //string字符串转int数字
    int result = 0;
    for(int i = 0; i < num.length(); i++){
    result += (int)(num[i] - '0') * pow(10, num.length() - i - 1);
    }
    return result;
}

int main() {
    init();
    int cnt;
    cin >> cnt;
    string input;
    getline(cin, input);    //吸收一个换行
    while(cnt--){
    getline(cin, input);
    if(input[0] <= '9' && input[0] >= '0')  //是数字
        cout << num_mars[str_num(input)] <<endl;
    else    //不是数字
        cout << mars_num[input] << endl;
    }
    return 0;
}

转载原创文章请注明,转载自: 斐斐のBlog » PAT-B 真题- 1044. 火星数字
目前还没有评论,快来抢沙发吧~