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