美文网首页
B1044 火星数字 (20分)

B1044 火星数字 (20分)

作者: km15 | 来源:发表于2020-02-16 16:24 被阅读0次

/*
题意:给出火星文或者是地球文,给出对应的另一项

解题:
1、用MAP,记录所有的,然后依靠键值对输出对应的

learn && wrong:
1、getline转为cin
2、输出数字,然后换行,记得带个getchar呀!!!
3、思路
数字不超过169,所以用了打表,怎么用呢
1)、先建012的火星文数组,然后012倍火星文的数组
2)、先处理十位为0,个位有数字的情况
在处理十位有数字,个位为0的情况
3)、接着处理个位,十位都有数字的情况
本质:是将字符压入了string数组,用string,int做map,然后将string做下标,统计数字
4)、在主函数里,将输入的作为string,先判断string是数字还是字符,如果是数字,累加形成数字,字符则直接输出
*/

#include <iostream>
#include <map>
#include <string>
#include <cstdio>
using namespace std;

//[0,12]的火星文
string unitdigit[13] = { "tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };

//13的[0,12]倍的火星文
string tendigit[13] = { "tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };

string numtostr[170];   //数字->火星文

map<string, int> strtonum;   //火星文->数字

void init() {
    for (int i = 0;i < 13;++i) {
        numtostr[i] = unitdigit[i]; //个位为[0,12],十位为0
        strtonum[unitdigit[i]] = i;
        numtostr[i * 13] = tendigit[i];
        strtonum[tendigit[i]] = 13 * i;
    }

    for (int i = 1;i < 13;++i) {    //十位
        for (int j = 1;j < 13;++j) {  //个位
            string str = tendigit[i] + " " + unitdigit[j];  //火星文   !!!
            numtostr[i * 13 + j] = str; //数字->火星文
            strtonum[str] = i * 13 + j; //火星文->数字
        }
    }
}

int main()
{
    init(); //打表
    int n;
    cin >> n;
    getchar();  //!!!应该是这里
    while (n--) {
        
        string str;
        getline(cin, str);
        if (str[0] >= '0' && str[0] <= '9') { //如果是数字
            int num = 0;    //字符串转为数字
            for (int i = 0; i < str.length();++i) {
                num = num * 10 + (str[i] - '0');
            }
            cout << numtostr[num] << endl;  //直接查表
        }
        else {  //如果是火星文
            cout << strtonum[str] << endl;  //直接查表
        }
    }
    return 0;
}

相关文章

网友评论

      本文标题:B1044 火星数字 (20分)

      本文链接:https://www.haomeiwen.com/subject/vaepfhtx.html