JavaScript PAT乙级题解 1048 数字加密

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

输入格式:

输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:

1234567 368782971

输出样例:

3695Q8118

题解如下:

20/20

注意a和b长度不相等的情况,如果a的长度大于b的长度,则b前置补零 (case2/case5);如果a的长度小于b的长度,则按a的长度对b进行加密后,将剩下没有加密过的b前置补到结果数组中

 将a和b存在数组里面并反转,从第一位开始挨个进行加密,注意加法没有隐式转换

/**
 * 2024/03/28
 * 20/20
 */
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (data) {
  let a = data.split(" ")[0].split("").reverse();
  let b = data.split(" ")[1].split("").reverse();
  // 如果b的长度小于a的长度,则b后置补0(本来应该是前置补0,但是我反转数组了)
  let length = a.length - b.length;
  if (length > 0) {
    b.length = a.length;
    b.fill(0, b.length - length);
  }
  let resArr = [];
  for (let i = 0; i < a.length; i++) {
    if (i % 2 === 0) {
      // 奇数位
      let res = (Number(a[i]) + Number(b[i])) % 13;
      switch (res) {
        case 10:
          resArr[i] = "J";
          break;
        case 11:
          resArr[i] = "Q";
          break;
        case 12:
          resArr[i] = "K";
          break;
        default:
          resArr[i] = res;
      }
    } else {
      // 偶数位
      let res = b[i] - a[i];
      if (res < 0) {
        resArr[i] = res + 10;
      } else {
        resArr[i] = res;
      }
    }
  }
  if (resArr.length < b.length) {
    resArr = resArr.concat(b.splice(resArr.length));
  }
  resArr.reverse();
  console.log(resArr.join(""));
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值