1044 火星数字 (20分) ac代码 详解 缝缝补补又一题

1044 火星数字 (20分)
火星人是以 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。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
。。。。
https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696

题解:
为输出格式判断各种情况
本位有无?
本位没有: 判断进位有无?
进位有:只用输出进位,再加一个换行
进位没有:那么进位本位都没有输出 0 的火星文是 tret
本位有:判断进位:
进位有: 那么加一个空格,然后输出本位
进位没有:不加换行输出

#include
#include
#include

using namespace std;


int main()
{
    string s1[30] = {"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
    string s2[30] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
    int n;
    cin>>n;
    getchar();
    while(n--){
        string s;
        getline(cin,s); //读入整行
        if(s[0]>='0'&&s[0]<='9'){  //输入是数字
            int num = 0;
            int len = s.size();
            for(int i=0; i<len; ++i){
                num*=10;
                num += s[i]-'0';
            }
            int k1 = num/13;   //k1是进位的个数
            if(k1!=0)
                cout<<s2[k1];
            int k2 = num - k1*13;       //k2是13以内的数
            //从这里判断开始,为输出格式判断各种情况
            /*本位有无?
            本位没有: 判断进位有无?
                进位有:只用输出进位,再加一个换行
                进位没有:那么进位本位都没有输出 0 的火星文是 tret
            本位有:判断进位:
                进位有: 那么加一个空格,然后输出本位
                进位没有:不加换行输出
            */
            if(k2==0){
                if(k1!=0){
                    cout<<endl;
                }
                else
                    cout<<s1[k2]<<endl;
            }
            else if(k1!=0)
                cout<<' '<<s1[k2]<<endl;
            else
                cout<<s1[k2]<<endl;
        }
        else{           //输入是火星文
            int len = s.size();
            string temp = "";
            int num = 0;

            for(int i=0; i<len; ++i){ 
                if(s[i]==' '||i==len-1){ //在空格的时候,和最后的时候,计算num
                    if(s[i]!=' ')  //这里注意加上
                        temp += s[i];
                    for(int i=1; i<=12; ++i){  //扫描
                        if(temp == s2[i]){
                            num += i*13;
                            break;
                        }
                    }
                    for(int i=1; i<=12; ++i){  //扫描
                        if(temp == s1[i]){
                            num += i;
                            break;
                        }

                    }
                    temp = "";  //清空

                }
                if(s[i]!=' ')
                    temp += s[i];  
            }
            cout<<num<<endl;
        }

    }
    return 0;
}

你可能感兴趣的:(pat乙级,字符串)