문제
계승으로 십진수를 코딩하는 것은 숫자의 거듭제곱이 아닌 계승에 의존하는 기본 시스템에서 숫자를 작성하는 방법입니다.
이 시스템에서 마지막 숫자는 항상 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