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; }

浙公网安备 33010602011771号