测试点2和测试点4错的来:1044 火星数字 (20分)

立志用更少的代码做更高效的表达


Pat乙级最优化代码+题解+分析汇总——>传送门


火星人是以 13 进制计数的:

地球人的 0 被火星人称为 tret。
地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的数字 29 翻译成火星文就是 hel mar;而火星文 elo nov 对应地球数字 115。为了方便交流,请你编写程序实现地球和火星数字之间的互译。

输入格式:
输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。

输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。

输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13


解题思路

题意:让我们设计一个程序,能自由的完成火星文到地球数字的转换。

要注意转换时为13进制。

测试点2和测试点4:

注意读题:在这里插入图片描述
也就是说:只有0能被称为tret(既然单独列出来作为一项规则,说明这个0是特殊的)。

如输入13,则输出tam。 而不是tam tret。


代码展示
#include<bits/stdc++.h>
using namespace std;
//地球文转化为火星文的映射 
char a[13]={'0','1','2','3','4','5','6','7','8','9','a','b','c'}; 
map<char, string>m1, m2;	

//火星文转化为地球文的映射
map<string, int>m3;		

int b[300];

int main() {		
	m1['0'] = "tret";
	m1['1'] = "jan"; m1['2'] = "feb"; m1['3'] = "mar"; m1['4'] = "apr";
	m1['5'] = "may"; m1['6'] = "jun"; m1['7'] = "jly"; m1['8'] = "aug";
	m1['9'] = "sep"; m1['a'] = "oct"; m1['b'] = "nov"; m1['c'] = "dec";
	
	m2['1'] = "tam"; m2['2'] = "hel"; m2['3'] = "maa"; m2['4'] = "huh";
	m2['5'] = "tou"; m2['6'] = "kes"; m2['7'] = "hei"; m2['8'] = "elo";
	m2['9'] = "syy"; m2['a'] = "lok"; m2['b'] = "mer"; m2['c'] = "jou";

	m3["dec"]= 12; m3["jou"]=12*13; m3["nov"]=11; m3["mer"]=11*13;
	m3["lok"]= 10*13; m3["oct"]=10; m3["syy"]=9*13; m3["sep"]=9;
	m3["elo"]=8*13; m3["aug"]=8; m3["hei"]=7*13; m3["jly"]=7;
	m3["kes"]=6*13; m3["jun"]=6; m3["tou"]=5*13; m3["may"]=5;
	m3["apr"]=4; m3["huh"]=4*13; m3["maa"]=3*13; m3["mar"]=3;
	m3["hel"]=2*13; m3["feb"]=2; m3["tam"]=1*13; m3["jan"]=1;
	m3["tret"]=0;
	  


	int n; cin>>n; 
	getchar();	//吸收空格,记住不要放到循环里 
	for(int i = 0; i < n; i++) {
		string s; 
		getline(cin, s);
		if(isalpha(s[0])) {	//如果是字母 
			stringstream ss;
			ss << s;
			string s1,s2;
			bool flag = false;
			int num = 0;		//累加和 
			while(ss >> s1) {
				num += m3[s1];
			}
			cout << num << '\n';
		} else {			//如果是数字 
			stringstream ss;	//把字符串转化成整型
			int x; 
			ss << s; ss >> x;
			string s1;
			if(x < 13) {
				s1 += a[x];
				cout << m1[s1[0]] << '\n';
			}
			else {
				s1 += a[x/13];
				x = x % 13;
				s1 += a[x];
				cout << m2[s1[0]];
				if(m1[s1[1]] != "tret") cout << ' ' << m1[s1[1]];
				cout << '\n'; 
			} 
		}
	}
	return 0;
} 

博主的碎碎念:

这道题做了一个多小时,如果在正式比赛铁炸了。 主要的难点是测试点2与测试点4, 以及字符串和数字之间的映射问题。 如果单纯用if-else暴力判断,不需要考虑那么多的映射关系, 应该会更简单一些。 毕竟我们是为了拿高分, 又不是为了炫技~

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来老铁干了这碗代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值