1100 Mars Numbers 之 STL map与string的故事

1. 题目

在这里插入图片描述

2. 分析

该题题目是:“火星数字”,题意是给出“火星数字”与地球数字的转换规则,然后让我们根据给出的内容是火星的还是地球的去变换成另一种数字;规则如下:

  1. 地球上的“0”,在火星称为“tret”;
  2. 地球上从1到12的数字,在火星上为"jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec"分别表示;
  3. 火星上满13进一位,如果进位的话,从1到12进位分别用"tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou"表示。

3. 解题过程

  1. 从本质上来说这是一个进制互换的题目,是十进制与十三进制的互换,而这道与众不同的是互换后不是数字而是给定的字符,所以简单来说,是给予了这些字符数字的功能,就是字符和数字建立了一一对应的关系,所以容易想到利用map与构造这种关系。
  2. 构建好数字与字符的关系后,这道题还有一点难的是,你要去判断给出的是火星数字还是地球数字,这里不会用cctype里的isdigit()函数的朋友可以用判断第一个字符是不是数字来判断,用代码表达就是
if(s[0] >= '0' && s[0] <= '9') //满足这个条件就是地球数字啦
  1. 具体来讲讲实现的一些小细节:一开始用string(这个真的是字符神器,像怎么用就怎么用)开一个数组,用来存放对应的字符,然后构建map,用for循环给建立一一对应的关系,如“tret”是“0”,“tam”是13等等。
  2. 然后写两个函数,分别是火星转地球的:先判断是不是13以内的,然后不是就可以拆成两个字符,这里着重介绍一下string的神函数name.substr(pos, len),这里pos代表你想裁剪的开始位置,len表示你想裁剪的长度,超好用的。然后就看用map一一对应的功能输出地球啦。
  3. 地球转火星的更简单:直接先把字符型数字转成int型数字,就可以利用map为所欲为啦哈哈。
  4. 直接看代码:
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<cctype>
using namespace std;
map<string, int> Mars;
map<string, int> mars;
string A[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string B[12] = {"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
void mars_to_earth(string a, map<string, int> &M, map<string, int> &m)
{
	if(a.length() < 5 && m[a] == 0)
	{
		printf("%d\n", M[a]);
	}
	else
	{
		int b = m[a.substr(0, 3)];
		string c;
		for(int i = 4; i < a.length(); i++)
		{
			c += a[i];
		}
		printf("%d\n", b+M[c]);
	}
}

void earth_to_mars(string a)
{
	int b = 0;
	for(int i = 0; i < a.length(); i++)
	{
		b = b * 10 + a[i] - '0';
	}
	int c = b / 13 ;
	int d = b % 13;
//	if(c != 0) printf("%s %s\n", B[c-1].c_str(), A[d].c_str());
//	else printf("%s\n", A[d].c_str());
	if(c != 0) printf("%s", B[c-1].c_str());
	if(c != 0 && d != 0) printf(" ");
	if(d || b == 0) printf("%s", A[d].c_str());
	printf("\n");
}
int main()
{
	int n; scanf("%d\n", &n);
	string a;
	for(int i = 0; i < 13; i++)
	{
		Mars[A[i]] = i;
	}
	for(int i = 0; i < 12; i++)
	{
		mars[B[i]] = (i+1) * 13;
	}
	for(int i = 0; i < n; i++)
	{
		getline(cin, a);
		if(isdigit(a[0])) earth_to_mars(a);
		else mars_to_earth(a, Mars, mars);
	}
	return 0;
}

4. 小结

  1. 有对应关系找map,处理字符找string;
  2. 如果你还有什么疑问欢迎留言,我们一起讨论吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值