1100 Mars Numbers (20 分)

各种乱搞过的=_=。

string mp[2][13]={
{"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"},
{"","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"}
};

int main()
{
    int T;
    cin>>T;
    cin.ignore();

    while(T--)
    {
        string s;
        getline(cin,s);

        if(isdigit(s[0]))
        {
            vector<int> res;
            int x=stoi(s);
            
            if(x == 0) res.pb(0);
            while(x)
            {
                res.pb(x%13);
                x/=13;
            }
            
            if(res.size() == 2)
                cout<<mp[1][res[1]];
            if((res.size() == 2 && res[0] == 0))
                cout<<endl;
            else if(res.size() == 2)
                cout<<' '<<mp[0][res[0]]<<endl;
            else
                cout<<mp[0][res[0]]<<endl;
        }
        else
        {
            int pos=s.find(' ');
            int res=0;
            if(pos != string::npos)
            {
                string t=s.substr(0,pos);
                int index1=0;
                for(int i=0;i<13;i++)
                    if(mp[1][i] == t)
                    {
                        index1=i;
                        break;
                    }
                res+=index1*13;
                s=s.substr(pos+1);
            }

            int index0=-1;
            for(int i=0;i<13;i++)
                if(mp[0][i] == s)
                {
                    index0=i;
                    break;
                }

            if(index0 == -1)
            {
                int index1=0;
                for(int i=0;i<13;i++)
                    if(mp[1][i] == s)
                    {
                        index1=i;
                        break;
                    }
                res+=index1*13;
            }
            else
                res+=index0;
            cout<<res<<endl;
        }
    }
    //system("pause");
    return 0;
}

可读性太差,觉得按照晴神思路重写一遍:
直接针对给出的输入进行模拟会相对复杂,考虑到数据范围最多不超过168,因此不妨将[0,168]的所有数都预处理出来(即打表),然后查询一个输出一个即可。这比直接通过输入来模拟要简单得多。

然后考虑对个位为[0,12]、十位为0的数与十位为[0,12]、个位为0的数进行特殊处理。

显然,对个位为[0,12]、十位为0的数来说,就是“tret” ~ “dec”,因此建立[0,12]与字符串的映射即可(字符串到数字的映射使用map<string, int>);对十位为[0,12]、个位为0的数来说,它们是13的倍数,也就是“tret” ~ “jou”,因此建立13的[0,12]倍与字符串的映射即可。

接着考虑个位和十位均不为0的数,根据题意,这些数可以直接通过十位的火星文拼接上个位的火星文得到。

注意点

13的倍数不应当输出个位的“tret”,例如13应当输出“tam” 而不是“tam tret”。

代码

非常清爽。

string mp[2][13]={
{"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"},
{"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++)
        for(int j=0;j<13;j++)
        {
            string str;
            if(i == 0) str=mp[0][j];
            else if(j == 0) str=mp[1][i];
            else str=mp[1][i]+' '+mp[0][j];
            numtostr[i*13+j]=str;
            strtonum[str]=i*13+j;
        }
}

int main()
{
    init();

    int T;
    cin>>T;
    cin.ignore();

    while(T--)
    {
        string s;
        getline(cin,s);
        if(isdigit(s[0]))
        {
            int res=0;
            for(int i=0;i<s.size();i++)
                res=res*10+(s[i]-'0');
            cout<<numtostr[res]<<endl;
        }
        else 
            cout<<strtonum[s]<<endl;
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14428862.html