Java에서 팩토리얼 계산

1. 개요

음이 아닌 정수 주어진 N , 요인 모두 양의 정수의 곱보다 작거나 같은 N .

이 빠른 자습서에서는 Java에서 주어진 숫자에 대한 계승을 계산하는 다양한 방법을 살펴 봅니다.

2. 20까지의 숫자에 대한 계승

2.1. for 루프를 사용한 팩토리얼

for 루프를 사용하는 기본 계승 알고리즘을 살펴 보겠습니다 .

public long factorialUsingForLoop(int n) { long fact = 1; for (int i = 2; i <= n; i++) { fact = fact * i; } return fact; }

위의 솔루션은 20까지의 숫자에 대해 잘 작동 합니다 . 그러나 20보다 큰 것을 시도하면 결과가 너무 커서 long에 맞지 않아 오버플 가 발생하므로 실패 합니다.

이들 각각은 작은 숫자에 대해서만 작동 한다는 점에 주목하면서 몇 가지를 더 살펴 보겠습니다 .

2.2. Java 8 스트림을 사용한 팩토리얼

Java 8 Stream API를 사용하여 팩토리얼을 매우 쉽게 계산할 수도 있습니다.

public long factorialUsingStreams(int n) { return LongStream.rangeClosed(1, n) .reduce(1, (long x, long y) -> x * y); }

이 프로그램에서 먼저 LongStream 을 사용하여 1과 n 사이의 숫자를 반복합니다 . 그런 다음 축소 단계를 위해 식별 값과 누산기 함수를 사용하는 reduce () 를 사용했습니다.

2.3. 재귀를 사용한 팩토리얼

이번에는 재귀를 사용하는 팩토리얼 프로그램의 다른 예를 살펴 보겠습니다.

public long factorialUsingRecursion(int n) { if (n <= 2) { return n; } return n * factorialUsingRecursion(n - 1); }

2.4. Apache Commons Math를 사용한 팩토리얼

Apache Commons Math에는 계승 을 계산하는 데 사용할 수 있는 정적 계승 방법 이있는 CombinatoricsUtils 클래스 가 있습니다.

Apache Commons Math를 포함하기 위해 commons-math3 종속성을 pom에 추가합니다 .

 org.apache.commons commons-math3 3.6.1 

CombinatoricsUtils 클래스 를 사용하는 예를 살펴 보겠습니다 .

public long factorialUsingApacheCommons(int n) { return CombinatoricsUtils.factorial(n); }

반환 유형은 자체 개발 솔루션과 마찬가지로 long 입니다.

계산 된 값을 초과하면, 여기 것을 의미 로부터 Long.MAX_VALUE을 하는 MathArithmeticException가 발생된다.

더 커지려면 다른 반환 유형이 필요합니다.

3. 20보다 큰 숫자에 대한 계승

3.1. BigInteger를 사용한 팩토리얼

앞에서 논의했듯이 long 데이터 유형은 n <= 20 인 경우에만 계승에 사용할 수 있습니다 .

더 큰 값의 N , 우리가 사용할 수있는 이 BigInteger 클래스를 으로부터 java.math의를 개최 할 수있는 패키지 에 값을 2 ^는 Integer.MAX_VALUE :

public BigInteger factorialHavingLargeResult(int n) { BigInteger result = BigInteger.ONE; for (int i = 2; i <= n; i++) result = result.multiply(BigInteger.valueOf(i)); return result; }

3.2. 구아바를 사용한 팩토리얼

Google의 Guava 라이브러리는 더 큰 숫자에 대한 계승을 계산하는 유틸리티 방법도 제공합니다.

라이브러리를 포함하기 위해 pom에 guava 종속성을 추가 할 수 있습니다 .

 com.google.guava guava 25.1-jre 

이제 BigIntegerMath 클래스 의 정적 계승 메서드를 사용하여 주어진 숫자의 계승을 계산할 수 있습니다.

public BigInteger factorialUsingGuava(int n) { return BigIntegerMath.factorial(n); }

4. 결론

이 기사에서 우리는 핵심 자바와 몇 가지 외부 라이브러리를 사용하여 계승을 계산하는 몇 가지 방법을 보았습니다.

우리는 먼저 최대 20 개의 숫자 계승을 계산하기 위해 long 데이터 유형을 사용하는 솔루션을 보았습니다 . 그런 다음 20보다 큰 숫자에 BigInteger 를 사용하는 몇 가지 방법을 보았습니다 .

이 기사에 제시된 코드는 Github에서 사용할 수 있습니다.