1100 Mars Numbers (20point(s)) Easy only once *进制问题升级版注意下

基本思想:

和进制思想类似,但是唯一不同的是,取余为0的时候个位忽略;

 

关键点:

普通枚举转换也可以,但是此次示例给的是打表方式;

 

当打表的时候可以直接枚举情况采用拼接字符串来进行快速运算,注意一下;

 

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector> 
#include<string>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<set>
using namespace std;

const int maxn = 169;
int n;

vector<string>dw = { "tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec" };
vector<string>gw = { "tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };
map<string, int>s2n;
string n2s[maxn];

void init() {
    for (int i = 0; i < maxn; i++) {
        if (i % 13 == 0) {
            //如果是13的倍数;
            int j = i / 13;
            n2s[i] = gw[j];
            s2n[gw[j]] = i;
        }
        else if (i < 13) {
            //如果应该是一位数
            n2s[i] = dw[i];
            s2n[dw[i]] = i;
        }
        else {
            //如果是两位数;
            string s = "";
            int temp = i;
            vector<string>vec;
            bool flag = true;
            while (temp!=0){
                if (flag) {
                    vec.push_back(dw[temp % 13]);
                    temp /= 13;
                    flag = false;
                }
                else {
                    vec.push_back(gw[temp % 13]);
                    temp /= 13;
                }
            }
            for (int i = vec.size() - 1; i >= 0; i--) {
                if (i == vec.size() - 1) {
                    s += vec[i];
                }
                else {
                    s += " " + vec[i];
                }
            }
            n2s[i] = s;
            s2n[s] = i;
        }
    }
}

//void init() {
//    for (int i = 0; i < 13; i++) {
//        n2s[i] = dw[i];
//        s2n[dw[i]] = i;
//        n2s[i * 13] = gw[i];
//        s2n[gw[i]] = i * 13;
//    }
//    for (int i = 1; i < 13; i++) {
//        for (int j = 1; j < 13; j++) {
//            string s = gw[i] + " " + dw[j];
//            n2s[i * 13 + j] = s;
//            s2n[s] = i * 13 + j;
//        }
//    }
//}

int main() {
    init();
    scanf("%d", &n);
    getchar();
    string s;
    for (int i = 0; i < n; i++) {
        getline(cin, s);
        if (s[0] >= '0'&&s[0] <= '9') {
            //如果是数字;
            int num = 0;
            for (int i = 0; i < s.size(); i++) {
                num = num * 10 + (s[i] - '0');
            }
            cout << n2s[num] << endl;
        }
        else {
            cout << s2n[s] << endl;
        }
    }
    return 0;
}

 

posted @ 2020-02-21 16:50  暮云林凌  阅读(116)  评论(0)    收藏  举报