1044 火星数字 (20分)
原题链接:传送门
一、题目:
输入格式:
输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例 1:
4
29
5
elo nov
tam
输出样例 1:
hel mar
may
115
13
二、解析:
思路:
将输入的值判断是否是数字,如果是数字那么就需要转换成火星文,同时注意输入的如果是0则打印tret。不是数字则是火星文,需要将火星文转换成数字。
(备注:两个数组最前面放两个空串只是为了取数字方便点)
1.数字转火星文:数字整除13,获得高位数的13进制数字下标。数字求余13,获得个位数的数字下标。
2.火星文转数字:判断火星文有没有空格,如果没有空格(数组长度等于1),那么就是一个数,查找火星文低位数组hxwLower中是否有这个值,如果有那么将该火星文的下标加起来。然后再查高位数,注意高位数因为进制是13,所以需要乘13。火星文如果有空格,也同上,分开来进行取值相加即可。
注意点:
注意先看懂题意!一点一点来。
AC代码:
import java.util.Scanner;
/**
* 1044 火星数字 (20分)
*
* @author: Sheng
* @date: 2019年12月5日 下午7:20:07
*/
public class Main {
static String[] hxwLower = {"", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
static String[] hxrHigh = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
String[] lang = new String[n];
s.nextLine();
for (int i = 0; i < n; i++) {
lang[i] = s.nextLine();
// if 是地球人的数字,那么转换成火星文
if (lang[i].matches("\\d+")) {
// 换算成13进制
Integer num = Integer.valueOf(lang[i]);
if (num == 0) {
System.out.println("tret");
continue;
}
int ten = num / 13; // 如果没有高位则输出空串
int unit = num % 13;
System.out.println((hxrHigh[ten] + " " + hxwLower[unit]).trim());
} else {
String[] split = lang[i].split(" ");
// if 是一位数
if (split.length==1) {
int num = fn(split[0]);
System.out.println(num);
continue;
}
int num01 = fn(split[0]);
int num02 = fn(split[1]);
System.out.println(num01+num02);
}
}
}
public static int fn(String hxw) {
int num = 0;
for (int j = 0; j < hxwLower.length; j ++) {
if (hxwLower[j].indexOf(hxw) != -1) {
num = num + j;
break;
}
}
// 高位
for (int j = 0; j < hxrHigh.length; j ++) {
if (hxrHigh[j].indexOf(hxw) != -1) {
num = num + j*13;
break;
}
}
return num;
}
}