1044 火星数字

/**
 * 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值