PAT乙级1044 火星数字

火星人是以 13 进制计数的:
1、地球人的 0 被火星人称为 tret。
2、地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
3、火星人将进位以后的 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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
输入的有数字也有字符,因此要用string类型保存输入的地球文或者火星文,然后判断是数字还是英文字母
1、若为数字,数字转火星文,先将字符转成int型,比如转成2929/13=2……3,所以高位是第二个hel,低位是第三个为mar,那么29对应的是hel mar,需要注意的是,如果输入的是十进制中13的倍数,那么低位是不用输出的;
2、火星文转数字,比如elo nov,elo在高位数字中表示第8个,所以是13*8=104,nov代表11,加起来即为115

知识点:

1、cin读取字符串时,是以空格为结束标志的,那么应该用getline(cin,m)读入string类型的带有空格的m
2、关于substr以及erase的使用;
3、string的比较用的compare;
4、string转成数字用str.c_str()
#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
	string low[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly","aug","sep","oct","nov","dec"};
    string high[13]={"0","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
    int n,res=0,len;
    int p_high,p_low; 
    string m;   //输入的待转数字 
    string thr;  //从输入的火星文中取三个英文字母 
    cin>>n;  
	getchar();    //读取输入N时后面的回车
    for(int i=0;i<n;i++)
    {
        res=0;
    	getline(cin,m); //读取一行以回车结束 
    	len=m.length();
    	if(m[0]>='a'&&m[0]<='z')  //火星文,截取三个字符一判断 
    	{
    	   while(len!=0) 
    	   {
    	    thr=m.substr(0,3);  //取m的第一个字母 
    	    m.erase(0,4);   //更新m,m为去掉第一个字母及其空格的字符
    	    len=m.length();
    	    for(int j=0;j<13;j++)
    	    {
    	    	if(thr.compare(low[j])==0)
    	    	res+=j;
    	    	if(thr.compare(high[j])==0)
    	    	res+=13*j;
			}	
		   }
		   cout<<res<<endl;
		} 
		else{                        //输入的是带引号的数字 
			 res=atoi(m.c_str());   //将字符转成数字
			 p_low=res%13;
			 p_high=res/13;
			 if(p_high==0)
			 cout<<low[p_low]<<endl;
			 else
			 {
			 	if(p_low==0)
				cout<<high[p_high]<<endl;
				else
			 	cout<<high[p_high]<<" "<<low[p_low]<<endl; 
			 }
		} 
    	
	}
 } 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值