本题要求实现一种数字加密方法。首先固定一个加密用正整数 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(""));
});