一、概述
数字与字符串的互相转换。
题目很容易理解。可最开始的实现害苦了我。字符串的坑还是多。
如果不用getline函数,那下面这种情况就很麻烦:
elo nov
这个作为输入,那么输出应该是115,elo对应115/13=8,noc对应115%13=11。
但是问题来了,这俩一起组成一个数字,我怎么才能把他们俩作为一个数字看待呢?
用cin不行,遇到空格就不输入了,%s输入也一样,%s加%c也不行,每个字符串后面都是一个空格,%c肯定吃了这个空格。
只能用getline。
getline是负责输入一行字符串的,空格也会被输入,默认是遇到回车停止输入。当然也可以自定义参数。
我们一般使用如下:
getline(cin,string)
其中cin表示输入,string表示把输入存的变量。像这样就是每次把一行的内容全放在string里。完全符合我们的要求。
二、分析
有了输入下面就是判断了。先判断是不是数字,直接看string的首位是不是数字即可。
为了方便,由于最多169个数字,因此我们可以使用string数组和map来进行一一对应,输入在判断之后可以直接输出,很方便。
因此我们要将数组和map初始化,函数如下:
string ntm[169];
string Mars1[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string Mars2[13]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
map<string,int> mtn;
void init()
{
for(int i=0;i<169;i++)
{
if(i<=12)
{
ntm[i]=Mars1[i];
mtn[ntm[i]]=i;
}
else if(i%13==0)
{
ntm[i]=Mars2[i/13];
mtn[ntm[i]]=i;
}
else
{
ntm[i]=Mars2[i/13]+" "+Mars1[i%13];
mtn[ntm[i]]=i;
}
}
}
这里用到了字符串的拼接,也就是string1+“ ”+string2就是直接把这两个string用空格隔开之后拼在一起了,而不是把它们的ASCII相加,用起来十分方便。
另外注意一点,13对应的是tam,而不是变为13进制后是10,然后对应tam tret,同理26对应的是hel。。。。。。
然后是输入,如下:
scanf("%d%*c",&N);
for(int i=0;i<N;i++)
{
string in;
getline(cin,in);
if(in[0]>='0'&&in[0]<='9')
{
int n=0;
int l=in.size();
for(int j=0;j<l;j++)
n=n*10+in[j]-'0';
cout<<ntm[n]<<"\n";
}
else
cout<<mtn[in]<<"\n";
}
注意这里第一个输入是%d%*c,%*c的用处是“跳过%d后面的一个字符输入”,在本题中也就是跳过回车,不然下面的第一个cin也就是回车了,这样就出现了错误。
然后判断,如果是数字,转为int然后输出,如果是火星文,则输出。
三、总结
字符串处理的一道很好的题目,字符串处理有时会用到一些函数,需要记住,别的地方一般用不到就可能忘记了。
PS:代码如下:
#include<stdio.h>
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
string ntm[169];
string Mars1[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string Mars2[13]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
map<string,int> mtn;
void init()
{
for(int i=0;i<169;i++)
{
if(i<=12)
{
ntm[i]=Mars1[i];
mtn[ntm[i]]=i;
}
else if(i%13==0)
{
ntm[i]=Mars2[i/13];
mtn[ntm[i]]=i;
}
else
{
ntm[i]=Mars2[i/13]+" "+Mars1[i%13];
mtn[ntm[i]]=i;
}
}
}
int main()
{
init();
int N;
scanf("%d%*c",&N);
for(int i=0;i<N;i++)
{
string in;
getline(cin,in);
if(in[0]>='0'&&in[0]<='9')
{
int n=0;
int l=in.size();
for(int j=0;j<l;j++)
n=n*10+in[j]-'0';
cout<<ntm[n]<<"\n";
}
else
cout<<mtn[in]<<"\n";
}
}