/**
* 1.本题思路:1.因为给出的可能是数字(地球文)也有可能是字母(火星文)
* 所以用字符串s保存每一次的输入,因为如果是火星文则会出现空格
* 所以用getline接收一行的输入~计算string s的长度len,判断s[0]是否是数字
* 如果是数字,表示是地球文,则需要转为火星文,执行func1();如果不是数字
* 则说明是火星文,需要转为地球文,执行func2();
* 2.func1(int t)中,传入的值是string转int后的结果stoi(s),因为数字最大不超过168
* 所以最多只会输出两位火星文,如果t / 13不等于0,说明有高位,所以输出b[t/13]
* 如果输出了高位(t/13不等于0)并且t % 13不等于0,说明有高位且有低位,所以此时输出空格;
* 如果t % 13不等于0,说明有低位,此时输出a[t % 13];注意,还有个数字0没有考虑
* 因为数字0取余13等于0,但是要特别输出tret,所以在func1的最后一句判断中加一句t == 0
* 并将a[0]位赋值成tret即可解决0的问题.
* 3.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即可
*
* 2.atoi():https://blog.csdn.net/yky__xukai/article/details/79554963
*
* 3.s.substr(4,3):https://blog.csdn.net/sunshihua12829/article/details/50484966
*
* 4.参考博客:https://www.liuchuo.net/archives/581
*
*/
#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 s;
int len;
//地球文-->火星文
void func1(int t) {
//如果t / 13不等于0,说明有高位,所以输出b[t/13]
if (t / 13) cout << b[t / 13];
//如果输出了高位(t/13不等于0)并且t % 13不等于0,说明有高位且有低位,所以此时输出空格
if ((t / 13) && (t % 13)) cout << " ";
//如果t % 13不等于0,说明有低位,此时输出a[t % 13]
//因为数字0取余13等于0,但是要特别输出tret
if (t % 13 || t == 0) cout << a[t % 13];
}
//火星文-->地球文
void func2() {
int t1 = 0, t2 = 0;
//因为火星文字符串只可能一个单词或者两个单词
//而且一个单词不会超过4,所以先将一个单词的赋值给s1,即s1 = s.substr(0, 3)
string s1 = s.substr(0, 3), s2;
//如果len > 4,就将剩下的一个单词赋值给s2,即s2 = s.substr(4, 3);
if (len > 4) s2 = s.substr(4, 3);
for (int j = 1; j <= 12; j++) {
//如果a数组中有和s1或者s2相等的
//说明低位等于j,则将j赋值给t2
if (s1 == a[j] || s2 == a[j]) t2 = j;
//如果b数组中有和s1相等的
//说明高位有值,将j赋值给t1
if (s1 == b[j]) t1 = j;
}
//最后输出t1 * 13 + t2
cout << t1 * 13 + t2;
}
int main() {
int n;
cin >> n;
getchar();
for (int i = 0; i < n; i++) {
//用字符串s保存每一次的输入
//如果是火星文则会出现空格
//所以用getline接收一行的输入
getline(cin, s);
//获取输入长度
len = s.length();
//判断是地球问还是火星文
if (s[0] >= '0' && s[0] <= '9')
//stoi()数字字符串转换成int输出
func1(stoi(s));
else
func2();
cout << endl;
}
return 0;
}
1044 火星数字
最新推荐文章于 2020-06-04 11:18:48 发布