回顾一下
自从期末复习进入了白热化阶段,简书我就断更了。
同时我也进行了一定的反思,每日更新一篇文章见证自己的进步固然很好,但是每篇没有必要写的跟个水文一样,自己难免也有点瞧不起。
所以我觉得应该做一定的改观了。有趣的图片能用的用,没必要的就不加了/其实我还是想加上的,也好看也生动对吧。
至于讲解的语言,再精简点。
舍去题目,直接放一个原题链接作为替代。
丰富一下结尾的总结内容,让人印象深刻一点。
I 'm BACK
Mars Numbers
原题链接
分析:
这道题目,是一个map用法的练习题目。很经典,初学时,值得仔细回味反复琢磨。
思路:打表。
关键点:
1.完成“火星文”的存储
2.开两个映射。string组,和map<string,int>
值得注意的是,string数组天生就是一个int到string的映射,无需map。
3.init函数负责打表工作。
代码如下:
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
using namespace std;
//火星数字的存储
string unitDigit[13] =
{"tret",
"jan",
"feb",
"mar",
"apr",
"may",
"jun",
"jly",
"aug",
"sep",
"oct",
"nov",
"dec"
};
string tenDigit[13] =
{
"tret",
"tam",
"hel",
"maa",
"huh",
"tou",
"kes",
"hei",
"elo",
"syy",
"lok",
"mer",
"jou"
};
//开两组映射
string numToStr[170];
map<string, int> strToNum;
//打表函数
void init()
{
for(int i = 0 ; i< 13 ; i++)//这是进行基础数字的构造
{
numToStr[i] = unitDigit[i];
strToNum[unitDigit[i]] = i;
//1-12
numToStr[i*13] = tenDigit[i];
strToNum[tenDigit[i]] = i *13 ;
}
for(int i = 1 ; i < 13 ; i++)
{
for(int j = 1 ; j < 13 ; j ++)
{
string str = tenDigit[i] +" "+ unitDigit[j];
numToStr[i*13 + j] = str;
strToNum [str] =i*13 + j;
}
}
}
int main()
{
init();
int Q;//Q个询问
scanf("%d%*c",&Q);//去除缓存区里面的回车
while(Q--)
{
string str;
getline(cin , str);
if(str[0] >= '0' && str[0] <= '9')//判定是数字
{
int num ;
num = atoi(str.c_str());
cout<<numToStr[num]<<endl;
}
else
{
cout<<strToNum[str]<<endl;
}
}
return 0 ;
}
我不想把代码备注得太过详细,影响你独立思考的过程。
总结
一、
打表和map映射是很好的搭配,解决问题起来相当容易。
这里有一个小小的注意点:
代码里scanf是
scanf("%d%*c",&Q)
实不相瞒,我一开始没有注意到,只是按照
scanf("%d",&Q)
输入的,结果提交之后一片青青草原。
我给出的解释(我认为的解释):
%*c作用是,忽略这个输入,哪也不存储。(抛弃)
因为我们输入Q这个数据之后,按下了回车键,这个回车留在了缓存区。
等到getline的时候,如果你没有通过%*c抛弃掉回车,getline就会得到这个回车,也就会多一个没有用的答案
二、
atoi
这个超赞的!!!
string str = "12345";
int num = atoi (str.c_str());
//实现了直接从char* 或者是string向int 的转化
atof
这也还行,就是有所精度的丢失
string str = "12345";
double num = atof (str.c_str());
我的码云链接
这里面没有什么个人的项目,我还没到那个水平。只是先把自己的做题代码放在这里做个成长记录。