1044 火星数字 (20分)(Java 题解)

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

相关

PAT - 乙级 - 题解集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值