题目链接: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;
}