PAT (Advanced Level) Practice 1100 Mars Numbers getline的使用和string的处理

一、概述

数字与字符串的互相转换。

题目很容易理解。可最开始的实现害苦了我。字符串的坑还是多。

如果不用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";
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值