1044 火星数字

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1044 火星数字相关的知识,希望对你有一定的参考价值。

1. 这题用上了新学的map容器打表技巧。打表适用于这一题,是因为数据范围1-169很小,map可以将字符串(包括带空格的)映射到int。至于int映射到string,直接用string型数组就可以了。

2. 一个细节注意一下,测试用例中13 对应的只是十位的tam,并不是tam tret。因此可以把数据分为3类处理

  • 0,1-12
  • 13,26……12*13等13的倍数
  • 其他0-168范围内的数

3. 怎样判断输入的是火星文还是地球文?看看第一个字符是字母还是数字

AC代码

#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<iostream>

using namespace std;

string lowMars[13] = {"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
string hignMars[13] = {"tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};

string numToStr[170];
map<string,int> strToNum;

void init(){//初始化numToStr和strToNum
	//对于0 
	numToStr[0] =  "tret";

	for(int i=1;i<=12;i++){
		//对于1-12
		numToStr[i] = lowMars[i];
		// 13的倍数 
		numToStr[i*13] = hignMars[i];//是的如果个位是0,那么无需表示
		//对于其他数
		for(int j=1;j<=12;j++){
			numToStr[i*13+j] = hignMars[i] + " " + lowMars[j];
		}  
	}
	
	for(int i=0;i<13;i++){
		strToNum[lowMars[i]] = i;
		strToNum[hignMars[i]] = i*13;
	}
	
	for(int i=1;i<=12;i++){
		for(int j=1;j<=12;j++){
			strToNum[hignMars[i] + " " + lowMars[j]] = i*13+j;
		}
	}	
}

int main(){
	
	int n;
	scanf("%d%*c",&n);
	 
	
	init();//打标 
	
	while(n--){
		string str;
		getline(cin,str);
		
		if(str[0]>='0'&&str[0]<='9'){
			//输入的是数字
			int num = 0;
			for(int i=0;i<str.length();i++){
				num = num*10+(str[i]-'0');
			}
			cout<<numToStr[num]<<endl;
		}else{
			cout<<strToNum[str]<<endl;
		}
	}
	
	
	
	return 0;
}

以上是关于1044 火星数字的主要内容,如果未能解决你的问题,请参考以下文章

PAT——1044. 火星数字

PAT 1044 火星数字

PAT 1044. 火星数字(20)

1044 火星数字 (20 分)

1044 火星数字 (20 分)

1044 火星数字(map+打表)