JavaScript PAT乙级题解 1044 火星数字

火星人是以 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

然后做完了看别人的题解才发现,其实题干的输入范围规定在了0-169之间,意思就是说转换为十三进制时最多只有两位,其实就用不着专门写递归进行转换

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

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值