PAT 乙级1044 火星数字

本文介绍了如何使用C++编程实现地球和火星数字的转换,利用unordered_map数据结构存储两个星球的数字对应关系,通过输入判断是地球文还是火星文,进而进行翻译。
摘要由CSDN通过智能技术生成

题目:

火星人是以 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

代码: 

#include <iostream>
#include <unordered_map>    //unordered_map是用于实现键值对的哈希表,与普通的map相比,不会根据键的大小进行排序,平均时间复杂度是常熟级别
#include <string>
using namespace std;

int main() {
    unordered_map<string, int> earthToMars = {
        {"tret", 0}, {"jan", 1}, {"feb", 2}, {"mar", 3}, {"apr", 4}, {"may", 5},
        {"jun", 6}, {"jly", 7}, {"aug", 8}, {"sep", 9}, {"oct", 10}, {"nov", 11}, {"dec", 12},
        {"tam", 13}, {"hel", 26}, {"maa", 39}, {"huh", 52}, {"tou", 65}, {"kes", 78},
        {"hei", 91}, {"elo", 104}, {"syy", 117}, {"lok", 130}, {"mer", 143}, {"jou", 156}
    };

    unordered_map<int, string> marsToEarth = {
        {0, "tret"}, {1, "jan"}, {2, "feb"}, {3, "mar"}, {4, "apr"}, {5, "may"},
        {6, "jun"}, {7, "jly"}, {8, "aug"}, {9, "sep"}, {10, "oct"}, {11, "nov"}, {12, "dec"},
        {13, "tam"}, {26, "hel"}, {39, "maa"}, {52, "huh"}, {65, "tou"}, {78, "kes"},
        {91, "hei"}, {104, "elo"}, {117, "syy"}, {130, "lok"}, {143, "mer"}, {156, "jou"}
    };

    int N;
    cin >> N;
    cin.ignore(); // 忽略换行符

    for (int i = 0; i < N; i++) {
        string input;
        getline(cin, input);    //使用getline()函数可以读取一整行的输入,包括其中的空格和换行符

        if (isdigit(input[0])) { // 地球文转火星文
            int earthNum = stoi(input);

            int high = earthNum / 13;
            int low = earthNum % 13;

            if (high > 0 && low > 0) {
                cout << marsToEarth[high * 13] << " " << marsToEarth[low] << endl;
            }
            else if (high > 0 && low == 0) {
                cout << marsToEarth[high * 13] << endl;
            }
            else {
                cout << marsToEarth[low] << endl;
            }
        }
        else { // 火星文转地球文
            string marsNum;
            int spaceIndex = input.find(" ");   //找到字符串的空格的下标索引值

            if (spaceIndex != string::npos) { // 输入含有两个火星文
                string highPart = input.substr(0, spaceIndex);  //substr()可以从原始字符串中的指定位置和长度提取出来一个新的字符串
                string lowPart = input.substr(spaceIndex + 1);

                int earthNum = earthToMars[highPart] + earthToMars[lowPart];

                cout << earthNum << endl;
            }
            else { // 输入只含有一个火星文
                cout << earthToMars[input] << endl;
            }
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值