1044 火星数字 (20分)
火星人是以 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。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
。。。。
https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696
题解:
为输出格式判断各种情况
本位有无?
本位没有: 判断进位有无?
进位有:只用输出进位,再加一个换行
进位没有:那么进位本位都没有输出 0 的火星文是 tret
本位有:判断进位:
进位有: 那么加一个空格,然后输出本位
进位没有:不加换行输出
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
int main()
{
string s1[30] = {"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string s2[30] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int n;
cin>>n;
getchar();
while(n--){
string s;
getline(cin,s); //读入整行
if(s[0]>='0'&&s[0]<='9'){ //输入是数字
int num = 0;
int len = s.size();
for(int i=0; i<len; ++i){
num*=10;
num += s[i]-'0';
}
int k1 = num/13; //k1是进位的个数
if(k1!=0)
cout<<s2[k1];
int k2 = num - k1*13; //k2是13以内的数
//从这里判断开始,为输出格式判断各种情况
/*本位有无?
本位没有: 判断进位有无?
进位有:只用输出进位,再加一个换行
进位没有:那么进位本位都没有输出 0 的火星文是 tret
本位有:判断进位:
进位有: 那么加一个空格,然后输出本位
进位没有:不加换行输出
*/
if(k2==0){
if(k1!=0){
cout<<endl;
}
else
cout<<s1[k2]<<endl;
}
else if(k1!=0)
cout<<' '<<s1[k2]<<endl;
else
cout<<s1[k2]<<endl;
}
else{ //输入是火星文
int len = s.size();
string temp = "";
int num = 0;
for(int i=0; i<len; ++i){
if(s[i]==' '||i==len-1){ //在空格的时候,和最后的时候,计算num
if(s[i]!=' ') //这里注意加上
temp += s[i];
for(int i=1; i<=12; ++i){ //扫描
if(temp == s2[i]){
num += i*13;
break;
}
}
for(int i=1; i<=12; ++i){ //扫描
if(temp == s1[i]){
num += i;
break;
}
}
temp = ""; //清空
}
if(s[i]!=' ')
temp += s[i];
}
cout<<num<<endl;
}
}
return 0;
}