火星人是以 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
题解如下:
20/20
这题大概就是个十进制与十三进制的相互转换,有一个要注意的点是0的处理,输入0能否正确输出tret;输入的如果是13的倍数的话不需要输出末位的tret文章来源:https://www.toymoban.com/news/detail-842498.html
然后做完了看别人的题解才发现,其实题干的输入范围规定在了0-169之间,意思就是说转换为十三进制时最多只有两位,其实就用不着专门写递归进行转换文章来源地址https://www.toymoban.com/news/detail-842498.html
/**
* 2024/03/21
* 20/20
*/
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let num = 0;
let rows = [];
rl.on("line", function (data) {
if (num === 0) {
num = Number(data);
} else {
rows.push(data);
if (rows.length === num) {
rows.forEach((el) => {
if (!isNaN(Number(el))) {
console.log(tenTo(el, []));
} else {
console.log(toTen(el));
}
});
}
}
});
let mars = [
"tam",
"hel",
"maa",
"huh",
"tou",
"kes",
"hei",
"elo",
"syy",
"lok",
"mer",
"jou",
];
let earth = [
"tret",
"jan",
"feb",
"mar",
"apr",
"may",
"jun",
"jly",
"aug",
"sep",
"oct",
"nov",
"dec",
];
/**
* 十进制转十三进制
* @param data
* @param resArr
* @returns {string}
*/
function tenTo(data, resArr) {
let front = Math.floor(data / 13);
let behind = data % 13;
if (front === 0) {
resArr.push(earth[behind]);
} else if (front < 13) {
resArr.push(mars[front - 1]);
resArr.push(earth[behind]);
} else {
tenTo(front, resArr);
resArr.push(earth[behind]);
}
// 如果最后一位是tret,则不显示,但是如果只有tret就显示(case1)
if (resArr[resArr.length - 1] === "tret" && resArr.length !== 0) {
resArr.pop();
}
return resArr.join(" ");
}
/**
* 十三进制转十进制
* @param data
* @returns {number}
*/
function toTen(data) {
let strArr = data.split(" ");
if (mars.includes(strArr[strArr.length - 1])) {
strArr.push("tret");
}
let numArr = [];
for (let i = 0; i < strArr.length; i++) {
if (earth.indexOf(strArr[i]) !== -1) {
numArr.push(earth.indexOf(strArr[i]));
} else if (mars.indexOf(strArr[i]) !== -1) {
numArr.push(mars.indexOf(strArr[i]) + 1);
}
}
let res = 0;
for (let i = 0; i < numArr.length; i++) {
let a = 1;
for (let j = 0; j < i; j++) {
a *= 13;
}
res += numArr[numArr.length - i - 1] * a;
}
return res;
}
到了这里,关于JavaScript PAT乙级题解 1044 火星数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!