解题过程的小记录,如有错误欢迎指出。
难度:三星(map映射题,尤其注意一下getline的写法)
题目分析
在火星上使用的是13进制(每个数字的叫法也不一样),在地球上使用的是10进制,要求给出其中一种星球上的数字,将其翻译成另一个星球能看懂的数字
注意点
- 火星的数字之间可能会含有空格,所以输入要用到getline
- getline(cin,str)会吸收上一个cin多余的回车符,要在使用前用getchar()吸收一下
- 火星数字表示13的时候,只要表示高位即可(这个可以通过测试用例看出)
我的解题过程
思路
- 在输入数据前建立两个map映射,一个是用于将火星数字翻译成地球数字的MarsToEarth,一个是用于将地球数字翻译成火星数字的EarthToMars
- 输入数据,判断输入的字符串的第一个字符是否是数字,如果是的话就使用EarthToMars,否则使用MarsToEarth
bug
- 忘了getline怎么写
- 写getline的时候忘记吸收前面多余的回车(不过这种调试都可以很快发现改正)
- 在写映射的时候有一个下标写错导致个位数映射出问题(下标要格外注意鸭)
代码
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
string lower[14] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
string higher[14] = { "tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };
map<string, int> MarsToEarth;
map<int, string> EarthToMars;
for (int i = 0; i < 13; i++) {
for (int j = 0; j < 13; j++) {
string index = "";
if (i != 0) {
index += higher[i];
if (j != 0) index += " " + lower[j];
}
else {
index += lower[j];
}
MarsToEarth[index] = 13 * i + j;
EarthToMars[13 * i + j] = index;
}
}
int n;
cin >> n;
getchar();//***getline()之前必须要接受回车
for (int i = 0; i < n; i++) {
string num;
getline(cin, num);
if (isdigit(num[0])) {//Earth->Mars
cout << EarthToMars[stoi(num)] << endl;
}
else {//Mars->Earth
cout << MarsToEarth[num] << endl;
}
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 本题晴神用了在初始化打表的方法(和我一样),柳神用了单独写函数每次进行计算的方法
- 这篇我还是更习惯自己的写法,记自己的即可