题目描述
根据火星数字与正常数字的转换关系,将输入的数字转换成对应的地球数字或者火星数字。
题目分析
我们通过判断输入字符串的开头是数字还是字母来判断其是否为地球数字还是火星数字。给定两个数组,分别存储的是火星上的0-12以及12个高位数字。我们通过将输入的字符数字转变为int数字之后,对13做除法,商为高位,余数为低位,寻找对应的火星数字即可。
对于火星数字的字符,我们使用字符串拼接的方法,得到火星的数字(这里面有一个细节就是我们遍历输入的字符串时,要通过空格将两个火星数字分割开,分别查找对应数字)。遍历之前声明的两个数组,找出相应结果输出即可。
字符串拼接可以通过简单的加法运算:
three = ""
three + "a" + "b"+ "c" => "abc"
代码
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main(){
int N;
cin>>N;
string mess;
string three="";
string one_th[13]={"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string two_th[13]={"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int len,number=0;
getchar(); //使用getline时他会将第一次cin>>N的时候回车记录在内,从而少一次循环所以用getchar()捕捉那个回车
for(int i=0;i<N;i++)
{
getline(cin,mess);
if(mess[0]>='0'&&mess[0]<='9')
{//如果是数字
for(int j=0;j<mess.size();j++)
number=number*10+mess[j]-'0';
if(number<13)//直接输出对应数字
cout<<one_th[number]<<endl;
else
{//如果大于等于13并且可以被13整除,则根据样例是不用输出0(tret)的
if(number%13==0)
cout<<two_th[number/13-1]<<endl;
else
cout<<two_th[number/13-1]<<" "<<one_th[number%13]<<endl;//否则的话要输入
}
}
else
{//如果是火星文
for(int k=0;k<mess.size();k=k+4)
{
//字符串的拼接可以通过简单的加和实现
three=three+mess[k]+mess[k+1]+mess[k+2];//读取每个火星文
for(int l=0;l<13;l++)
{
if(three==one_th[l])//如果火星文在one_th数组里,那么它是13进制中的个位数,只需加上坐标
number+=l;
if(three==two_th[l])//如果在two_th数组中,则每次要乘以13
number+=(l+1)*13;
}
three="";//three置为空,等下会需要从0拼接
}
cout<<number<<endl;
}
number=0;
}
return 0;
}
答题用时17min
Q44——finish√