
팩토리얼 연산 (!) 은 특정 값 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이라는 매개변수를 넣어도 흉악하게 팩토리얼 연산이 수행되긴한다 ㅎ;