【PAT乙级】1044 火星数字

    科技2022-07-14  113

    题目链接:1044 火星数字

    思路

    首先通过第一位是否为数字判断为哪种语言,分2种情况处理。地球数处理:模13后将商与余数专为火星文的十位,个位并输出。火星数处理:一位则直接转化输出,两位则分别转换相加后输出。这道题思路上比较直接,就是代码冗长,写了50多行,看着还挺乱的,不知道大佬是不是有简洁的写法或者思路。

    代码

    #include <iostream> using namespace std; string oneM[13] = {"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string tenM[13] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; int find(string s){//返回s代表的数字 for(int i=0;i<13;i++){ if(s == oneM[i]) return i; if(s == tenM[i]) return 13*i; } return 0; } void translate(string s){ string numM1,numM10;//火星数十位,个位 if(s[0]>='0' && s[0]<='9'){//地球数处理方案 int numE = 0,flag10,flag1;//flag记录是否有10位,个位 for(int i=0;i<s.length();i++) numE = numE * 10 + (s[i] - '0');//字符转数字 flag10 = numE > 12 ? 1 : 0; flag1 = numE % 13 ? 1 : 0; numM10 = tenM[numE/13]; numM1 = oneM[numE%13]; if(flag10) cout << numM10; if(flag10 && flag1) cout << ' '; if(flag1 || !flag10) cout << numM1; cout << endl; } else{//火星数处理方案 int numE = 0; if(s.length()==3) numE = find(s); else{//有两位的情况 numM1 = s; numM10 = s; numM1.erase(0,4); numM10.erase(3,4); numE = find(numM1); numE += find(numM10); } cout << numE << endl; } } int main(){ int N; cin >> N; getchar();//吸收cin未接收的回车 for(int i=0;i<N;i++){ string s; getline(cin,s); translate(s); } return 0; }
    Processed: 0.009, SQL: 8