【PAT乙级】火星数字

正文索引 [隐藏]

题目描述:

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

解题思路:

 看完题目之后一脸懵逼,13进制转换,而且还要用火星文,它这个火星文搞起我有点想笑,不就是1~12不就是月份吗 哈哈哈哈 好吧 正经一点。先建立俩个字符串数组,一个数组a是0~13的火星文,另一个数组b是12个高位数字。然后用isdigit()这个函数判断输入的是地球数字还是火星文,这一步其实只需要看第一个字符是不是数字即可。若第一个字符是数字调用自定义函数earth2spark把地球数字转火星文,否则调用自定义函数spark2earth来把火星文转地球数字。地球数字转火星文时,需要先用一个atoi(s.c_str())来把字符串数字s转换成一个int型的数字,接着对这个数字进行判断,若小于13,直接调用数组a把它转换成火星文进行输出。因为题目已知输入的数字n小于100,所以当数字大于13时,直接将十位数转火星文进行输出,如果这个数还存在个位数的话就继续将个位数转火星文并输出。火星文转数字时,先判断这个火星文字符串s的长度是否大于3,若大于3说明这个火星数是高位数,在火星文字符串s中寻找子字符串,在a,b数组中找到对应的下标,通过这个下标来转换地球数字,第一个火星文单词转地球数字时要用下标乘以13再累加到sum,第二个火星单词找到对应下标后累加到sum就行了,此时sum的值就是高位火星文转地球数字后的值。若小于3说明这个火星数是个低位数,然后判断这个火星文是个位的还是十位的,在相应的字符串数组中找到下标累加到sum即可(同理,若火星文单词是十位)的就需要乘以13再累加),最后输出sum即可。

AC代码:

#include <bits/stdc++.h>
using namespace std;

void earth2spark(string s);    //地球数字转火星文
void spark2earth(string s);    //火星文转地球数字
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct","nov", "dec"};
string b[13] = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy","lok", "mer", "jou"};

int main()
{
    int n;
    cin >> n;
    getchar();
    for (int i = 0; i < n; i++)
    {
        string temp;
        getline(cin,temp);
        if(isdigit(temp[0]))  //若输入的temp是数字
        {
            earth2spark(temp);
        }
        else
        {
            spark2earth(temp);
        }
    }
    return 0;
}

void earth2spark(string s)   //地球数字转火星文
{
    int n = atoi(s.c_str());   //string型数字转int型数字
    if(n < 13)   //若数字小于13
    {
        cout << a[n];
    }
    else   //若数字大于13
    {
        cout << b[n/13];  //输出转换后的十位数
        if(n%13!=0)   //若有个位数
        {
            cout << " " << a[n%13];
        }
    }
    cout << endl;
}

void spark2earth(string s)   //火星文转地球数字
{
    int sum = 0;
    if(s.length() > 3)
    {
        for (int i = 0; i < 13; i++)
        {
            if(s.substr(0,3) == b[i])    //第一个火星文单词,地球数字的十位
            {
                sum += (i*13);
            }
            if(s.substr(4,7) == a[i])    //第二个火星文单词,地球数字的个位
            {
                sum += i;
            }
        }
    }
    else
    {
        for (int i = 0; i < 13; i++)
        {
            if(s == a[i])   //若火星文单词是个位
            {
                sum += i;
                break;
            }
            if(s == b[i])   //若火星文单词是十位
            {
                sum += (i*13);
                break;
            }
        }
    }
    cout << sum << endl;
}