PAT (Basic Level) Practice 1044 火星数字

题目:给定火星数字,输出对应的地球数字;给定地球数字,输出对应的火星数字。

火星数字:

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

输入格式:

第一行:正整数N

随后N行:每行给出一个[0,169)区间内的数字,或是地球文或是火星文

输出格式:

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

示例:

 地球人的数字 29 翻译成火星文就是 hel mar

(hel表示进位后的高位数字2,mar表示3,2*13+3=29)

火星文 elo nov 对应地球数字 115

(elo表示进位后的高位数字8,nov表示11,8*13+11=115)

地球数字13对应火星文tam

(tam表示进位后的高位数字1,1*13=13,可以看到转换时把个位的零丢了)

火星文 tam 对应地球数字 13

(因为所给的数字的范围在[0,169)内,所以给定的地球数字转换为火星文数字最多用不超过两个火星文来表示)jou dec = 12 * 13 + 12 = 168。(火星数字的个位由tret和低位火星文表示,十位由高位火星文表示) 

思路:

火星数字转换为地球数字:(用sum=0记录地球数字的值)

        若为高位火星文,则sum += 高位火星文表示的值*13 

        若为低位火星文,则sum += 低位火星文表示的值

注:给出的火星数字不超过两个火星文表示

地球数字转换为火星数字

        若地球数字小于13,则直接输出其对应的低位火星文

        若地球数字大于13,则输出(地球数字/13)对应的高位火星文,若(地球数字%13)不等于0,则再输出(地球数字%13)对应的低位火星文,否则不输出

代码:

#include
#include
#include

#include
using namespace std;
void insertMap();
// 数字0-12的火星文
string huoLowNum[13] = {"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
// 进位以后的12个高位数字(1-12)
string huoHighNum[12] = {"tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
map mpLowNum;  // 火星文到地球文的映射,低位
map mpHighNum; // 火星文到地球文的映射,高位
int main(){
    insertMap(); // 将火星文和地球文的映射关系插入表中
    string sn;getline(cin,sn);int n = stoi(sn);
    for(int i = 0 ; i < n ; i ++){
        string num;getline(cin,num); // 读入数据
        if(num[0] >= '0' && num[0] <= '9'){
            // 地球文 --> 火星文
            int nowNum = stoi(num); // 13
            if(nowNum < 13)
                cout << huoLowNum[nowNum] << endl;
            else{
                cout << huoHighNum[nowNum / 13 - 1];
                if(nowNum % 13 != 0)
                    cout << " " << huoLowNum[nowNum % 13];
                cout << endl;
            }
        }else{
            // 火星文 --> 地球文
            vector v; // 记录输入的火星字符
            int len = num.size();string temp;
            for(int i = 0 ; i < len ; i ++){
                if(num[i] == ' '){
                    v.push_back(temp);
                    temp = "";
                }else{
                    temp += num[i];
                }
            }
            if(!temp.empty()) v.push_back(temp);
            int sum = 0;
            for(unsigned int i = 0 ; i < v.size() ; i ++){
                if(mpLowNum.find(v[i]) != mpLowNum.end())
                    sum += mpLowNum[v[i]];
                if(mpHighNum.find(v[i]) != mpHighNum.end())
                    sum += (13 * mpHighNum[v[i]]);
            }
            cout << sum << endl;
        }
    }
    return 0;
}

注:火星数字和地球数字的映射关系可以用map来记录

void insertMap(){
    // 0 - 12
    mpLowNum["tret"] = 0;
    mpLowNum["jan"] = 1;
    mpLowNum["feb"] = 2;
    mpLowNum["mar"] = 3;
    mpLowNum["apr"] = 4;
    mpLowNum["may"] = 5;
    mpLowNum["jun"] = 6;
    mpLowNum["jly"] = 7;
    mpLowNum["aug"] = 8;
    mpLowNum["sep"] = 9;
    mpLowNum["oct"] = 10;
    mpLowNum["nov"] = 11;
    mpLowNum["dec"] = 12;
    // 1 - 12
    mpHighNum["tam"] = 1;
    mpHighNum["hel"] = 2;
    mpHighNum["maa"] = 3;
    mpHighNum["huh"] = 4;
    mpHighNum["tou"] = 5;
    mpHighNum["kes"] = 6;
    mpHighNum["hei"] = 7;
    mpHighNum["elo"] = 8;
    mpHighNum["syy"] = 9;
    mpHighNum["lok"] = 10;
    mpHighNum["mer"] = 11;
    mpHighNum["jou"] = 12;
}

你可能感兴趣的:(小白编程,c++,PTA,PAT,小白编程,PAT1044)