[Java] factorial (BigInteger 이용)

jhn1m·2024년 7월 4일

Java

목록 보기
4/5

팩토리얼 연산 (!) 은 특정 값 n이 있을 때 1부터 n까지의 값을 모두 곱한것을 말하지만.

자바의 숫자는 최대크기가 정해져있음.

일반적인 팩토리얼은 재귀함수를 이용하여 연산하지만 14정도의 수를 팩토리얼 연산(87,178,291,200) 한다면 int형에서는 오버플로우가 발생할 수 있다. 가령 long을 사용한다 하더라도 21 까지밖에 연산(51,090,942,171,709,440,000)하지 못하고 오버플로우가 발생할 수 있다

int >> -2,147,483,648 ~ 2,147,483,647
long >> -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

원래의 팩토리얼 함수는 이렇게 만들 수 있다

private static int factorial(int s) {
        return (s <= 1) ? s : s * (factorial(s - 1));
    }
}

하지만 조금이라도 큰 수가 나온다면 바로 오버플로우가 발생함.

이때를 위해 있는 "BigInteger" 가 있다

The range must be at least 1 to 2^500000000. 출처 : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigInteger.html

범위가 말도안됨 ㅎ

하지만 BigInteger는 일반적인 사칙연산같은 부분은 모두 메서드로 진행된다.

변경된 코드

private static String factorial(String s) {
        BigInteger bi = new BigInteger(s);
        return (bi.compareTo(BigInteger.ONE) <= 0) ? bi.toString(): bi.multiply(new BigInteger(factorial(String.valueOf(bi.subtract(BigInteger.ONE))))).toString();
    }

5000이라는 매개변수를 넣어도 흉악하게 팩토리얼 연산이 수행되긴한다 ㅎ;

0개의 댓글