![在这里插入图片描述](https://img-blog.csdnimg.cn/42a65dbab012492aab1d029937a44086.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjU4NTE5OQ==,size_16,color_FFFFFF,t_70)
很简单,但是有个坑
测试点错误原因
测试点1 考察的是输入数字0 能否正常打印
测试点2 4 考察的是13的倍数。火星文只有高位比如十进制的130,转成13进制应该是A0表示,但由于火星数字十位有单独的表达方式,故不需要个位0占位,所以如果只剩一个个位0是不需要翻译的。
多学习一下柳神的简洁代码,func2分类查找真是太妙了
My Code
#include<iostream>
#include<string>
using namespace std;
int findnum(string s, string a[], string b[]);//学习怎么把数组写入函数中
int findnum(string s, string a[], string b[]) {
for (int m = 0; m < 13; m++) { if (a[m] == s) { return m; break; } }
for (int m = 0; m < 13; m++) { if (b[m] == s) { return m * 13; break; } }
}
int main() {
int n;
cin >> n;
string a[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug","sep", "oct", "nov", "dec" };
string b[13] = { "####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo","syy", "lok", "mer", "jou" };
getchar();//必须隔着for
for (int i = 0; i < n; i++) {
string s;
getline(cin, s);//????为毛,真tm神奇??????
if (isdigit(s[0])) {
int temp;
temp = stoi(s);
if (b[temp / 13] == "####") cout << a[temp % 13] << endl;
else if(a[temp % 13]=="tret") cout << b[temp / 13] <<endl;
else cout << b[temp / 13] + " " + a[temp % 13] << endl;
}
else {
//想想办法,把这玩意分开
if (s.length() > 4) {
string t1, t2;
for (int j = 0; j < s.length(); j++) {
//写笔记,定义j,用的是i
if (s[j] == ' ') { t1 = s.substr(0, j); t2 = s.substr(j + 1, s.length() - 1); }
}
cout << findnum(t1, a, b) + findnum(t2, a, b) << endl;
}
else { cout << findnum(s, a, b) << endl; }
}
}
return 0;
}
柳神代码
分析:因为给出的可能是数字(地球⽂)也有可能是字⺟(⽕星⽂),所以⽤字符串s保存每⼀次的输
⼊,因为如果是⽕星⽂则会出现空格,所以⽤getline接收⼀⾏的输⼊~计算string s的⻓度len,判断
s[0]是否是数字,如果是数字,表示是地球⽂,则需要转为⽕星⽂,执⾏func1();如果不是数字,则说
明是⽕星⽂,需要转为地球⽂,执⾏func2();
func2()中,t1和t2⼀开始都赋值0,s1和s2⽤来分离⽕星⽂单词,因为⽕星⽂字符串只可能⼀个单词或者两个单词,而且⼀个单词不会超过4,所以先将⼀个单词的赋值给s1,即s1 = s.substr(0, 3);如果len> 4,就将剩下的⼀个单词赋值给s2,即s2 = s.substr(4, 3);然后下标j从1到12遍历a和b两个数组,如果
a数组中有和s1或者s2相等的,说明低位等于j,则将j赋值给t2;如果b数组中有和s1相等的(b数组不会和s2相等,因为如果有两个单词,s2只可能是低位),说明高位有值,将j赋值给t1,最后输出t1 *13 + t2即可~
#include <iostream>
#include <string>
using namespace std;
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug",
"sep", "oct", "nov", "dec"};
string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo",
"syy", "lok", "mer", "jou"};
int n;
string s;
void func1(int t) {
if(t/13) {
if(t%13==0) cout<<b[t/13];
else cout<<b[t/13]<<" "<<a[t%13];
}
else cout<<a[t];
}
void func2() {
int t1 = 0, t2 = 0;
string s1 = s.substr(0, 3), s2;
if (s.length() > 4) s2 = s.substr(4, 3);
for (int j = 1; j <= 12; j++) {
//s1在a[]b[]数组中都要找(因为可能没有s2,),s2只需要在a[]中找,因为s2只可能是低位。
if (s1 == a[j] || s2 == a[j]) t2 = j;
if (s1 == b[j]) t1 = j;
}
cout << t1 * 13 + t2;
}
int main(){
cin>>n;
getchar();
for(int i=0;i<n;i++){
getline(cin,s);
if (s[0] >= '0' && s[0] <= '9') func1(stoi(s));
else func2();
cout << endl;
}
return 0;
}
二刷代码
#include <iostream>
#include <string>
using namespace std;
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug",
"sep", "oct", "nov", "dec"};
string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo",
"syy", "lok", "mer", "jou"};
string change(string s){
if(isdigit(s[0])){
if(s.size()==1) return a[stoi(s)];
if(a[stoi(s)%13]=="tret") return b[stoi(s)/13];//测试点4的问题
else if(b[stoi(s)/13]=="####") return a[stoi(s)%13];//测试点2的问题
else return b[stoi(s)/13]+" "+a[stoi(s)%13];
}else{
if(s.size()>4){
int t1=0;
for(int i=0;i<13;i++) if(s.substr(0,3)==b[i]) t1+=i*13;
for(int i=0;i<13;i++) if(s.substr(4)==a[i]) t1+=i;
return to_string(t1);
}else{
int t2;
for(int i=0;i<13;i++) if(s.substr(0)==b[i]) {t2+=i*13;return to_string(t2);}
for(int i=0;i<13;i++) if(s.substr(0)==a[i]) {t2+=i;return to_string(t2);}
}
}
}
int main(){
int n;
cin>>n;
getchar();
for(int i=0;i<n;i++){
string temp;
getline(cin,temp);
cout<<change(temp)<<endl;
}
return 0;
}
测试点
输入:
4
13
26
10
20
标准输出:
tam
hel
oct
tam jly