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

解析

  先读一个字符串,如果第一位是数字,则转为火星文,否则就是火星文转数字,这里数字最大168,13进制最多2位数
  数字转火星文,先atoi(),变成整数再转换为13进制(除基取余法),保存在b数组里,最多两位b[0] b[1],如果b[1]>0,说明有两位火星文,如果b[0]是0的话,说明数字为13的倍数,变成火星文就是tam hel..等高位数,题目要求是不再输出整13后边的0,要及时退出,只输出高位即可。如果b[0]>0,就不退出继续往下输出low[b[0]],如果b[1] == 0的话,说明只有一位火星文,这一位一定是低位,只输出low[b[0]]
  火星文转数字,用getline()读取后边的输入,当输入一位火星文的时候,读取的是空行,然后将两个火星文s1,s2和low[],high[]依次比较,其中s1可能是低位、高位,s2只能是低位,对应求和 高位*13 + 低位就完成火星文的转换

答案

#include<iostream>
#include<algorithm>
#include<string>
#include<stdio.h>
#include<string.h>

using namespace std;
char low [14][5]{"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
                                                     
char high[14][5]{"6666","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};

int main(){     
    int m;
    cin >> m;

    while(m--){
        int a = 0,c = 0,b[5] = {0} ,k=0,flag = 1;
        char s1[10],s2[10];
        memset(s2,0,sizeof(s2));
        cin >> s1;
        
        if (s1[0] >= '0' && s1[0] <= '9') {
            flag = 0;
        }
        if(flag){
            cin.getline(s2,20);
            for(int i = 0 ; i < 13 ; i ++){
                if(strcmp(s2 + 1,low[i]) == 0 || strcmp(s1,low[i]) == 0) {
                    c = i ;
                }
                if(strcmp(s1,high[i]) == 0){
                    a = i * 13;
                }
            }
            cout << a  + c <<endl;
        }else{
            //数字处理
            a = atoi(s1);
            while(a > 0){
                b[k++] = a % 13;
                a /= 13;
            }
            if(b[1]){
                if(b[0]  == 0){
                    cout << high[b[1]] <<endl;
                    continue;
                }else{
                    cout << high[b[1]] << " ";
                }
            }
            cout << low[b[0]] << endl ;
        }
    }
}   
posted @ 2020-08-05 17:45  小马小马最可爱  阅读(340)  评论(0)    收藏  举报