Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 숫자 팩토리얼(계승)의 자릿수 개수 구하기

문제 설명

숫자 num을 첫 번째이자 유일한 인수로 받는 JavaScript 함수를 작성해야 합니다.

이 함수는 num의 팩토리얼(계승) 값이 총 몇 자리 숫자로 이루어져 있는지 계산하여 반환해야 합니다.

예를 들어, 함수에 다음과 같은 입력이 주어졌다고 가정해 보겠습니다 −

입력

const num = 7;

출력

const output = 4;

출력 설명

7!의 값은 5040이며, 이 숫자는 총 4자리로 이루어져 있기 때문입니다.

접근 방법

팩토리얼은 입력값이 조금만 커져도 기하급수적으로 증가하기 때문에, 실제 값을 직접 계산하면 금방 JavaScript의 안전한 정수 범위(Number.MAX_SAFE_INTEGER)를 초과하게 됩니다. 따라서 로그의 성질을 활용하는 것이 훨씬 효율적입니다.

로그의 덧셈 법칙에 따르면 log10(n!) = log10(n) + log10(n-1) + ... + log10(2)가 성립합니다. 또한 어떤 양수 x의 자릿수는 floor(log10(x)) + 1로 구할 수 있습니다. 이 두 가지 성질을 결합하면 팩토리얼 값을 직접 계산하지 않고도 원하는 자릿수를 손쉽게 구할 수 있습니다.

예시

다음은 위 접근 방식을 구현한 코드입니다 −

const num = 7;
const countDigits = (num = 1) => {
   let res = 0;
   while(num >= 2){
      res += Math.log10(num);
      num--;
   };
   return ~~res + 1;
}
console.log(countDigits(num));

여기서 ~~res는 비트 연산자(NOT)를 두 번 사용한 것으로, 양수에 대해서는 Math.floor()와 동일하게 소수점 이하를 버리는 역할을 합니다.

출력

4