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 ;
}
}
}

浙公网安备 33010602011771号