题目描述:
火星人是以13进制计数的:
地球人的0被火星人称为tret。
地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
火星人将进位以后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的数字“29”翻译成火星文就是“hel mar”;而火星文“elo nov”对应地球数字“115”。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
输入格式:
输入第一行给出一个正整数N(<100),随后N行,每行给出一个[0, 169)区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
题目分析:本题目其实就是进制的转化而已,这个不难。麻烦的是因为不清楚输入的是字符串还是地球数字,因此只能全部按照字符串进行读入。麻烦的是要处理字符串。使用string容器,sscanf()(这个函数的讲解请见这里)能简化工作。
注意点:1.题目要求了数据的范围在[0,169)以内,因此可以看到待转化火星文数字最多只有两位(对于火星数字)。
2.此外注意13 的整数倍,转化成火星文字后不许输出tret。
3.可以根据读入的字符串的第一位是不是在0~9以内来区分地球数字和火星数字
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string huyi1[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string huyi2[13]={"***","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
//这样设置两个数组的好处,是直接可以使用其下标进行计算
void to_earth(string str){ //实现火星文到地球数字的转化
int len=str.length() ; //首先判断下长度,因为出tret以为都是三个字母,
if(len<4){ //所以如果字符串的长度小于4那么可以肯定里面就一位火星文
for(int i=0;i<13;i++){
if(str==huyi1[i]){
cout<<i<<endl; //输出对应的地球数字
}
else if(str==huyi2[i]){ //在低位中没找到,就去高位中找
cout<<i*13<<endl;
}
}
}
else{
int gao,di; //存放高位数字、低位数字
string a=str.substr(0,3) ,b=str.substr(4,3); //火星文有两位,分别取出来 a为低位,b为高位
for(int i=0;i<13;i++){
if(a==huyi2[i]){
gao=i; //返回高位对应的地球数字
}
if(b==huyi1[i]){
di=i; //返回低位对应的地球数字
}
}
cout<<gao*13+di<<endl; //按照格式输出
}
}
void to_mars(string str){ //将地球数字转换为火星数字
int temp;
sscanf(str.c_str(),"%d",&temp); //该函数我之前介绍过了,实现将字符串内容以int型输入到temp当中
//sscanf不能对string实行这种操作,使用str的c_str()将其转换成字符数组
if(temp<13){
cout<<huyi1[temp]<<endl; //数字小于13,属于低位
}
else if(temp%13==0){ //如果是13的倍数,不需输出tret
cout<<huyi2[temp/13]<<endl;
}
else{
cout<<huyi2[temp/13]<<" "<<huyi1[temp%13]<<endl; //按照格式输出高位和低位的火星文
}
}
int main()
{
int n;
cin>>n;
string str[1000];
getchar();
for(int i=0;i<n;i++){
getline(cin,str[i]); //读入每个需要转化的字符串
}
for(int i=0;i<n;i++){
if(str[i][0]>='0'&&str[i][0]<='9'){ //先检查第一位数字如果是0~9,那么就是地球文字,需要将其转化成火星文字
to_mars(str[i]);
}
else{
if(str[i]=="tret"){ //特判,如果字符串就一个tret,直接输出零即可
cout<<'0'<<endl;
}
else to_earth(str[i]); //否则进行转换
}
}
return 0;
}