用阶乘编码十进制数是一种在依赖于阶乘而不是数的幂的基本系统中写出数字的方法。
在此系统中,最后一位数字始终为 0,并且以 0 为基数!。前面的数字是 0 或 1,以 1 为底!前面的数字是 0、1 或 2,以 2 为基数!等。更一般地说,倒数第 n 个数字始终是 0、1、2、...、n 且以 n 为基数! .
我们将需要两个函数。第一个将接收一个十进制数并返回一个具有阶乘表示的字符串。
第二个将接收一个具有阶乘表示的字符串并生成十进制表示。
例如 -
十进制数 463 被编码为“341010”,因为 -
463 = 3×5! + 4×4! + 1×3! + 0×2! + 1×1! + 0×0!
以下是代码 -
const num = 463; const decimalToFact = (num = 1) => { const legend = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); let str = '0'; let i = 2; while(num){ str = legend[num%i] + str; num = Math.floor(num / i); i++; }; return str; }; const factToDecimal = (str = '') => { const legend = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); const l = str.length; return str .split('') .reduce((a,e,i) => Number(a) * (l - i) + legend.indexOf(e), 0); }; const fact = decimalToFact(num); const dec = factToDecimal(fact); console.log(fact); console.log(dec);输出结果
以下是控制台输出 -
341010 463