좋은 기반
정수 num의 경우 num base k의 모든 자릿수가 1인 경우 k(k>=2) num의 좋은 base라고 합니다.
예:13 밑수 3은 111이므로 3은 num =13에 대한 좋은 밑수입니다.
문제
숫자를 유일한 인수로 나타내는 문자열 str을 취하는 JavaScript 함수를 작성해야 합니다. 함수는 str에 대한 좋은 기반이 되는 가능한 가장 작은 숫자의 문자열 표현을 반환해야 합니다.
예를 들어, 함수에 대한 입력이 -
인 경우const str = "4681";
그러면 출력은 다음과 같아야 합니다. -
const output = "8";
출력 설명:
4681 기수 8은 11111이기 때문에
예시
이에 대한 코드는 -
const str = "4681"; const smallestGoodBase = (n = '1') => { const N = BigInt(n), bigint2 = BigInt(2), bigint1 = BigInt(1), bigint0 = BigInt(0) let maxLen = countLength(N, bigint2) // result at most maxLen 1s const findInHalf = (length, smaller = bigint2, bigger = N) => { if (smaller > bigger){ return [false]; }; if (smaller == bigger) { return [valueOf1s(smaller, length) == N, smaller] }; let mid = (smaller + bigger) / bigint2; let val = valueOf1s(mid, length); if(val == N){ return [true, mid]; }; if (val > N){ return findInHalf(length, smaller, mid - bigint1); }; return findInHalf(length, mid + bigint1, bigger); }; for (let length = maxLen; length > 0; length--) { let [found, base] = findInHalf(length); if(found){ return '' + base; } }; return '' + (N - 1); function valueOf1s(base, lengthOf1s) { let t = bigint1 for (let i = 1; i < lengthOf1s; i++) { t *= base t += bigint1 } return t } function countLength(N, base) { let t = N, len = 0 while (t > bigint0) { t /= base len++ } return len } }; console.log(smallestGoodBase(str));
출력
콘솔의 출력은 -
8