PAT A1100 解题思路 及 测试点 1 解决方法

首先注意容易错的地方,即 13 的整数倍转换为火星文时不要带最后的 tret 。

还要注意输入的字母有没有打错!最好直接复制粘贴!!!

测试点1涉及到 0 的转化,有这个错误的同学可以试一下。

第一种方法是自己写的:

逐个处理特殊情况比较复杂,没用过STL 的同学可以使用这个方法。
 

#include<stdio.h>
#include<string.h>
char di[13][5] = {"tret","jan", "feb","mar" , "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
char gao[13][4] = {"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};

void toearth(char o[100]){
	int len = strlen(o);
	int shi = 0,ge = 0;
	char shiwei[4],gewei[4];
	if (len > 4){
		for(int i = 0;i < 3;i++ ){
			shiwei[i] = o[i];
		}
		for(int i = 4;i < 7;i++){
			gewei[i - 4] = o[i];
		}
		for(int i = 0;i < 13;i++){
			if(strcmp(shiwei,gao[i]) == 0){
				shi = i ;
				break;
			}
		}
		for(int i = 0; i < 13;i++){
			if(strcmp(gewei,di[i]) == 0){
				ge = i;
				break;
			}
		}
		printf("%d",shi * 13 + ge);	
	}else{
		if(strcmp(o,"tam\n") == 0) printf("13");
		else{
		for (int i = 0;i < 3;i++){
			gewei[i] = o[i];
		}
		for(int i = 0;i < 13;i++){
			if(strcmp(gewei,di[i]) == 0){
				ge = i;
				break;
			}
		}
	
	printf("%d",shi * 13 + ge);}
	

}
		}
		

void tohuo(char p[]){
	int num = 0;
	int lenp = strlen(p);
	for(int i = 0;i < lenp - 1;i++){
		num = num * 10 + (p[i] - '0');
	}
	if(num <= 12){
		printf("%s",di[num]);
	}else if(num == 13){
		printf("tam");
	}else{
		int shiwei = num / 13;
		int gewei = num % 13;
		printf("%s %s",gao[shiwei],di[gewei]);
	}
}

	
int main(){
	int n;
	scanf("%d",&n);
	getchar();
	char lan[n][100];
	for(int i = 0;i < n;i++){
		fgets(lan[i],100,stdin);
	}
	
	for(int i = 0;i < n;i++ ){
		if(lan[i][0] >= 'a' && lan[i][0] <= 'z'){
			toearth(lan[i]);
		}else{
			tohuo(lan[i]);
		}
		if(i < n - 1){
			printf("\n");
		}
	}
	return 0;
}

第二种是算法笔记上面的,使用了 string map ,先建立对应关系,直接判断输出就行。

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

using namespace std;

string unitdigit[13] = {"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};
string tendigit[13] = {"tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};
string numTostr[170];
map<string,int>strTonum;

void init(){
	for(int i = 0;i < 13;i++){
		numTostr[i] = unitdigit[i];   // 0 - 12 的映射实现 
		strTonum[unitdigit[i]] = i;
		numTostr[i * 13] = tendigit[i];  // 13 的 整数倍的映射实现 
		strTonum[tendigit[i]] = i * 13;
	}
	for(int i = 1;i < 13;i++){
		for(int j = 1;j < 13;j++ ){
			string str = tendigit[i] + " " + unitdigit[j];
			numTostr[i * 13 + j] = str;
			strTonum[str] = i * 13 + j;
		}
	}
}
int main(){
	init();
	int T;
	scanf("%d",&T);
	getchar();
	string str[T];
	for(int k = 0; k < T;k++){
		getline(cin,str[k]); 
	}
	for(int k = 0; k < T;k++){
		if(str[k][0] >= '0' && str[k][0] <= '9'){
			int num = 0;
			for(int i = 0;i < str[k].length();i++){
				num = num * 10 + (str[k][i] - '0'); 
			}
			cout << numTostr[num] << '\n';
		}else{
			cout << strTonum[str[k]] <<'\n';
		}
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值