C++ - PAT - 1044. 火星数字(20)

火星人是以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

思路:

1.数字转火星文:10进制数转换成13进制数,由于数字区间是[0,169)所以13进制数最多能有两位数,降低了编程的难度,只需要考虑一位数和两位数。细节在于数字的处理,字符串的处理。进制的转换。

2.火星文转数字:火星文给出了高位和低位,解析火星文时,只要高位的数字x13+低位数字就得道了十进制数。输出即可。细节在于字符串的切割比较。大小判断。



#include<cstdio>
#include<string>
#include<iostream>
#include<cmath>
using namespace std;

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



int main(){
  
 	 void tras1(string s);
  	void tras2(string s);
  
  	int n;
  	scanf("%d\n",&n);
  
  	string input;
  
  	while(n--){
  	  	getline(cin,input);
    
   	 	if(input[0]>='0'&&input[0]<='9'){
      		tras1(input);
    	}else{
      		tras2(input);
    	}
  	}
  	return 0;
} 

//数字转换火星文 
void tras1(string s){
  	int num=0;
  	int x = 0;
  	for(int i=s.size()-1 ;i>=0 ;i--){
  		num += (s[i]-48) * pow(10,x);
  		x++;
  	}
  	if(num<13){
    	cout<<num1[num]<<endl;
  	}
  	else if(num%13==0){
  	  	cout<<num2[num/13]<<endl;
  	}
  	else{
    	cout<<num2[num/13]<<" "<<num1[num%13]<<endl;
  	}
  
}
//火星文转换为数字 
void tras2(string s) {
    string a[13] = {"###", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
    string b[13] = {"###", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
    int len = s.length();
    if (len == 3) {
        for (int j = 1; j <= 12; j++) {

			if(s == a[j]){
				cout << j << endl;
			}
			else if(s==b[j]){
                cout << 13 * j << endl;
            }
        }
    } else {
        int t1 = 0;
        int t2 = 0;
        string s1 = s.substr(0,3);
        string s2 = s.substr(4,3);
        for (int j = 1; j <= 12; j++) {
			if(s1==b[j]){
                t1 = j;
            }

			if(s2==a[j]){
			
                t2 = j;
            }
        }
        cout << t1 * 13 + t2 << endl;
    }
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值