Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript에서 10진수를 계승으로 인코딩하고 역으로 인코딩

<시간/>

문제

계승으로 십진수를 코딩하는 것은 숫자의 거듭제곱이 아닌 계승에 의존하는 기본 시스템에서 숫자를 작성하는 방법입니다.

이 시스템에서 마지막 숫자는 항상 0이고 기수 0!입니다. 그 앞의 숫자는 0 또는 1이며 기수 1!입니다. 그 앞의 숫자는 0, 1 또는 2이고 기수 2! 등입니다. 보다 일반적으로 n번째에서 마지막 숫자는 항상 0, 1, 2, ..., n이고 기수 n에 있습니다! .

두 가지 기능이 필요합니다. 첫 번째는 10진수를 받고 계승 표현이 있는 문자열을 반환합니다.

두 번째는 계승 표현이 있는 문자열을 수신하고 10진수 표현을 생성합니다.

예를 들어 -

10진수 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