[java] Java에서 계승을 계산하는 방법이 있습니까?

아직 찾지 못했습니다. 내가 뭐 놓친 거 없니? 팩토리얼 방법이 초보자를위한 일반적인 예제 프로그램이라는 것을 알고 있습니다. 그러나 이것을 재사용하기 위해 표준 구현을 갖는 것이 유용하지 않을까요? 표준 유형 (예 : int, long …) 및 BigInteger / BigDecimal에서도 이러한 방법을 사용할 수 있습니다.



답변

계승에 대한 라이브러리 기능을 갖는 것이 유용하지 않을 것이라고 생각합니다. 효율적인 팩토리얼 구현에 대한 많은 연구가 있습니다. 다음은 몇 가지 구현입니다.


답변

Apache Commons Math 에는 MathUtils 클래스 에 몇 가지 팩토리얼 메서드가 있습니다.


답변

public class UsefulMethods {
    public static long factorial(int number) {
        long result = 1;

        for (int factor = 2; factor <= number; factor++) {
            result *= factor;
        }

        return result;
    }
}

HoldOffHunger의 Big Numbers 버전 :

public static BigInteger factorial(BigInteger number) {
    BigInteger result = BigInteger.valueOf(1);

    for (long factor = 2; factor <= number.longValue(); factor++) {
        result = result.multiply(BigInteger.valueOf(factor));
    }

    return result;
}


답변

베어 네이 키드 팩토리얼은 실제로 거의 필요하지 않습니다. 대부분 다음 중 하나가 필요합니다.

1) 하나의 팩토리얼을 다른 팩토리얼로 나누거나

2) 근사 부동 소수점 답.

두 경우 모두 간단한 맞춤형 솔루션을 사용하는 것이 좋습니다.

(1)의 경우, x = 90! / 85 !, 그러면 90을 유지할 필요없이 x = 86 * 87 * 88 * 89 * 90과 같이 결과를 계산합니다! 메모리에 🙂

(2)의 경우 “Stirling의 근사치”에 대해 google.


답변

BigIntegerMath다음과 같이 Guava를 사용하십시오 .

BigInteger factorial = BigIntegerMath.factorial(n);

( intlong에 대한 유사한 기능 은 IntMathLongMath각각 에서 사용할 수 있습니다 .)


답변

팩토리얼은 초보 프로그래머에게 좋은 연습을 제공하지만 대부분의 경우 유용 하지 않으며 모든 사람이 팩토리얼 함수를 작성하는 방법을 알고 있으므로 일반적으로 평균 라이브러리에 없습니다.


답변

나는 이것이 조회 테이블에 의해 가장 빠른 방법이라고 믿습니다.

private static final long[] FACTORIAL_TABLE = initFactorialTable();
private static long[] initFactorialTable() {
    final long[] factorialTable = new long[21];
    factorialTable[0] = 1;
    for (int i=1; i<factorialTable.length; i++)
        factorialTable[i] = factorialTable[i-1] * i;
    return factorialTable;
}
/**
 * Actually, even for {@code long}, it works only until 20 inclusively.
 */
public static long factorial(final int n) {
    if ((n < 0) || (n > 20))
        throw new OutOfRangeException("n", 0, 20);
    return FACTORIAL_TABLE[n];
}

기본 유형 long(8 바이트)의 경우 최대20!

20! = 2432902008176640000(10) = 0x 21C3 677C 82B4 0000

분명히 21!오버플로가 발생합니다.

따라서 기본 유형의 long경우 최대 값 만 20!허용되고 의미 있고 정확합니다.