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

JavaScript BigInt로 큰 수의 팩토리얼 계산하기

개요

JavaScript에서 일반적인 Number 타입은 안전하게 표현할 수 있는 정수 범위가 제한되어 있습니다(약 2^53 - 1까지). 따라서 10 이상의 숫자를 팩토리얼하면 결과가 이 범위를 훌쩍 넘어가며, 정밀도 손실 없이는 계산할 수 없습니다.

이 문제를 해결하기 위해 JavaScript는 임의 정밀도 정수를 다룰 수 있는 BigInt 타입을 제공합니다. 이 글에서는 BigInt를 활용해 매우 큰 수의 팩토리얼을 정확하게 계산하고, 그 결과를 문자열로 반환하는 함수를 작성하는 방법을 알아보겠습니다.

문제 정의

숫자 하나를 입력으로 받아 해당 숫자의 팩토리얼을 계산하는 JavaScript 함수를 작성해야 합니다. 특히 10보다 큰 숫자처럼 일반적인 변수 타입으로는 표현할 수 없는 큰 팩토리얼 값을 BigInt를 사용해 계산하고, 최종 결과는 문자열로 변환하여 반환합니다.

예를 들어 입력이 다음과 같다면:

const num = 45;

출력은 아래와 같아야 합니다:

const output = '119622220865480194561963161495657715064383733760000000000';

구현 방법

핵심 로직은 다음과 같습니다:

  • 입력받은 숫자를 BigInt() 생성자로 변환합니다.
  • 초기값을 1n(BigInt 리터럴)으로 설정한 팩토리얼 변수를 준비합니다.
  • 반복문을 돌면서 각 단계마다 현재 값에서 감소하는 수를 곱해 나갑니다.
  • 마지막에 String()으로 변환하여 문자열 형태의 결과를 반환합니다.

예제 코드

const num = 45;

const longFactorial = (num) => {
  var bigInt = BigInt(num);
  var factorial = 1n;
  for (let i = 0n; i < bigInt; i++) {
    factorial *= bigInt - i;
  }
  return String(factorial);
}

console.log(longFactorial(45));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다:

119622220865480194561963161495657715064383733760000000000

주요 포인트 정리

  • BigInt 리터럴: 숫자 뒤에 n을 붙여(1n, 0n) BigInt 값을 직접 표현할 수 있습니다.
  • 타입 일관성: BigInt와 일반 Number는 연산 시 혼합할 수 없으므로, 반복문 내 모든 피연산자를 BigInt로 유지해야 합니다.
  • 결과 출력: BigInt를 그대로 콘솔에 출력하면 뒤에 n이 붙기 때문에, String()으로 변환하면 깔끔한 숫자 문자열을 얻을 수 있습니다.

이처럼 BigInt를 사용하면 JavaScript에서도 정밀도 손실 없이 매우 큰 수의 팩토리얼을 손쉽게 계산할 수 있습니다.