PAT1044 火星数字

火星人是以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
解题思路:这是一道类似求任意进制的题目,难点在于:
一,输入。输入的数据里有数字与字符串,通过程序可以判断出来,并将数字字符转换为整型。
二,不同进制之间的转换,参考我们比较熟悉的16进制就可以知道任意进制转换的算法,关键是求余数。
代码如下:
(1)比较两字符串是否相同,用于确定火星文字符代表的数值。

bool isSame(string strA, string strB){
    bool flag = true;
    for (int i = 0; i < strA.length(); ++i){
        if (strA[i] != strB[i]){ flag = false; break; }
    }
    if (flag)return true;
    else return false;
}

(2)输入函数,要求该程序能自动将字符里的数字字符转换为整型,这样以后可以较方便处理。

int N,p=0,sN,num=0,k=0;
    string g[100] = { "" };
    int nums[100] = { 0 };
    cin >> N;
    sN = N;
    while (N--){
        cin >> g[p];
        ++p;
    }
    for (int i = 0; i < sN; ++i){
        num = 0;
        if (g[i][0] <= '9'&&g[i][0] >= '0'){
            int len = g[i].length();
            for (int j = 0; j< g[i].length(); ++j){
                num += ((int)g[i][j] - 48)*pow(10,--len);
            }
            nums[k++] = num;
        }
    }

(3)两种不同进制之间的转换

string Mars[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
    string MarsPro[12] = { "tam", " hel", " maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", " mer", "jou" };
    int num = 115;
    int temp = 0;
    int a=0,b = 0;
    temp = num;
    if (temp <= 12){ cout << Mars[temp - 1]; }
    else{
        a = temp / 13;
        b = temp % 13;
    }
    cout << a << " " << b << endl;
    cout << MarsPro[a-1] << " "<<Mars[b] << endl;
    string numStr[2] = { "elo", "nov" };
    string numA = { "aug" };
    int k = 0, m = 0,v=1;
    if (v == 2){
        for (int i = 0; i < 12; ++i){
            if (isSame(numStr[0], MarsPro[i])){
                k = i;
                break;
            }
        }
        for (int i = 0; i < 13; ++i){
            if (isSame(numStr[1], Mars[i])){
                m = i;
                break;
            }
        }
        cout << (k + 1) * 13 + m << endl;
    }
    else{
        bool flag = false;
        for (int i = 0; i < 12; ++i){
            if (isSame(numA, MarsPro[i])){
                k = i;
                flag = true;
                cout << (k + 1) * 13 << endl;
                break;
            }
        }
        if (flag==false){
            for (int i = 0; i < 13; ++i){
                if (isSame(numA, Mars[i])){
                    m = i;
                    cout << m << endl;
                    break;
                }
            }
        }
    }

你可能感兴趣的:(C++,pat)