首先注意容易错的地方,即 13 的整数倍转换为火星文时不要带最后的 tret 。
还要注意输入的字母有没有打错!最好直接复制粘贴!!!
测试点1涉及到 0 的转化,有这个错误的同学可以试一下。
第一种方法是自己写的:
逐个处理特殊情况比较复杂,没用过STL 的同学可以使用这个方法。
#include<stdio.h>
#include<string.h>
char di[13][5] = {"tret","jan", "feb","mar" , "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
char gao[13][4] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
void toearth(char o[100]){
int len = strlen(o);
int shi = 0,ge = 0;
char shiwei[4],gewei[4];
if (len > 4){
for(int i = 0;i < 3;i++ ){
shiwei[i] = o[i];
}
for(int i = 4;i < 7;i++){
gewei[i - 4] = o[i];
}
for(int i = 0;i < 13;i++){
if(strcmp(shiwei,gao[i]) == 0){
shi = i ;
break;
}
}
for(int i = 0; i < 13;i++){
if(strcmp(gewei,di[i]) == 0){
ge = i;
break;
}
}
printf("%d",shi * 13 + ge);
}else{
if(strcmp(o,"tam\n") == 0) printf("13");
else{
for (int i = 0;i < 3;i++){
gewei[i] = o[i];
}
for(int i = 0;i < 13;i++){
if(strcmp(gewei,di[i]) == 0){
ge = i;
break;
}
}
printf("%d",shi * 13 + ge);}
}
}
void tohuo(char p[]){
int num = 0;
int lenp = strlen(p);
for(int i = 0;i < lenp - 1;i++){
num = num * 10 + (p[i] - '0');
}
if(num <= 12){
printf("%s",di[num]);
}else if(num == 13){
printf("tam");
}else{
int shiwei = num / 13;
int gewei = num % 13;
printf("%s %s",gao[shiwei],di[gewei]);
}
}
int main(){
int n;
scanf("%d",&n);
getchar();
char lan[n][100];
for(int i = 0;i < n;i++){
fgets(lan[i],100,stdin);
}
for(int i = 0;i < n;i++ ){
if(lan[i][0] >= 'a' && lan[i][0] <= 'z'){
toearth(lan[i]);
}else{
tohuo(lan[i]);
}
if(i < n - 1){
printf("\n");
}
}
return 0;
}
第二种是算法笔记上面的,使用了 string map ,先建立对应关系,直接判断输出就行。
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
using namespace std;
string unitdigit[13] = {"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
string tendigit[13] = {"tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
string numTostr[170];
map<string,int>strTonum;
void init(){
for(int i = 0;i < 13;i++){
numTostr[i] = unitdigit[i]; // 0 - 12 的映射实现
strTonum[unitdigit[i]] = i;
numTostr[i * 13] = tendigit[i]; // 13 的 整数倍的映射实现
strTonum[tendigit[i]] = i * 13;
}
for(int i = 1;i < 13;i++){
for(int j = 1;j < 13;j++ ){
string str = tendigit[i] + " " + unitdigit[j];
numTostr[i * 13 + j] = str;
strTonum[str] = i * 13 + j;
}
}
}
int main(){
init();
int T;
scanf("%d",&T);
getchar();
string str[T];
for(int k = 0; k < T;k++){
getline(cin,str[k]);
}
for(int k = 0; k < T;k++){
if(str[k][0] >= '0' && str[k][0] <= '9'){
int num = 0;
for(int i = 0;i < str[k].length();i++){
num = num * 10 + (str[k][i] - '0');
}
cout << numTostr[num] << '\n';
}else{
cout << strTonum[str[k]] <<'\n';
}
}
return 0;
}