Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การเข้ารหัสเลขฐานสิบเป็นแฟกทอเรียลและกลับกันใน JavaScript


ปัญหา

การเข้ารหัสเลขฐานสิบด้วยแฟกทอเรียล (factorial number system) เป็นวิธีเขียนตัวเลขในระบบฐานที่ขึ้นกับแฟกทอเรียล แทนที่จะเป็นกำลังของตัวเลข

ในระบบนี้ หลักสุดท้ายจะเป็น 0 เสมอ และอยู่ในฐาน 0! หลักก่อนหน้าเป็น 0 หรือ 1 ฐาน 1! หลักก่อนหน้านั้นเป็น 0, 1, 2 ฐาน 2! ฯลฯ โดยทั่วไป หลักที่ n นับจากท้ายจะเป็น 0, 1, 2, ..., n และอยู่ในฐาน n!

เราต้องการ 2 ฟังก์ชัน ฟังก์ชันแรกรับเลขฐานสิบ คืนค่าสตริงแทนในระบบแฟกทอเรียล ฟังก์ชันที่สองรับสตริงแฟกทอเรียล คืนค่าเลขฐานสิบ

เช่น เลขฐานสิบ 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