Java에서 계승을 계산하는 방법

Mohammad Irfan 2023년10월12일
  1. Java의 반복적 방법을 사용하여 계승 가져오기
  2. Java에서 재귀 메서드를 사용하여 계승 찾기
  3. Java에서 동적 접근 방식을 사용하여 계승 찾기
  4. Java에서 Apache Commons를 사용하여 팩토리얼 찾기
  5. Java 8 스트림을 사용하여 팩토리얼 찾기
  6. Java에서 BigInteger를 사용하여 팩토리얼 찾기
  7. BigIntegerMath 라이브러리를 사용하여 계승 찾기
Java에서 계승을 계산하는 방법

이 자습서에서는 Java에서 계승을 계산하는 방법과 코드 예제를 소개합니다.

숫자 n의 계승은 1n 사이의 모든 자연수의 곱입니다. 이 튜토리얼에서는 숫자의 계승을 계산하는 다양한 방법을 볼 것입니다.

먼저 20과 같은 숫자의 계승을 계산하는 방법을 살펴보겠습니다. 이러한 분리는 Java의 제한된 범위의 긴 데이터 유형 때문입니다.

20 이상의 숫자의 계승은 너무 커서 long 범위에 맞지 않습니다.

Java의 반복적 방법을 사용하여 계승 가져오기

이 예에서는 긴 유형의 변수 store_fact를 만들고 1로 초기화했습니다.

그런 다음 1부터 계승이 계산된 숫자까지 모든 정수를 반복하고 루프 변수 값을 store_fact 값과 곱합니다. 계산된 값을 store_fact 변수에 저장하고 루프 변수를 업데이트했습니다.

위의 알고리즘을 더 명확하게 하기 위해 다음과 같이 작성할 수 있습니다.

  • n 초기화
  • store_fact = 1 초기화
  • for i = 1n으로 변경
  • store_fact = store_fact*n
  • 증가 i
  • store_fact 반환

위의 알고리즘에서 store_fact 변수는 n의 계승을 다음과 같이 저장합니다.

  • 첫 번째 반복 후: store_value = 1 = 1!
  • 두 번째 반복 후: store_value = 1 X 2 = 2!
  • 세 번째 반복 후: store_value = 1 X 2 X 3 = 3!
  • n번째 반복 후: store_value = 1 X 2 X 3 X 4 ........ Xn = n!

이제 위의 알고리즘에 대한 코드 예제를 살펴보겠습니다.

import java.util.Scanner;
public class SimpleTesting {
  static long factCalculator(int n) {
    long store_fact = 1;
    int i = 1;
    while (i <= n) {
      store_fact = store_fact * i;
      i++;
    }
    return store_fact;
  }
  public static void main(String args[]) {
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(factCalculator(number));
  }
}

출력:

Enter a number: 
4
24

Java에서 재귀 메서드를 사용하여 계승 찾기

위의 반복 방법은 임의의 수의 계승을 찾는 재귀 방법으로 변환될 수 있습니다. 이 방법에서는 기본 사례를 다음과 같이 취합니다.

if (n == 0 || n == 1) {
  return 1;
}

기본 조건이 충족되지 않으면 다음을 반환합니다.

n* factCalculator(n - 1);

아래의 코드 예제를 보자. 재귀적 방법인 factCalculator()를 사용하여 계승을 찾았습니다.

import java.util.*;
public class SimpleTesting {
  static long factCalculator(int n) {
    if (n == 0 || n == 1) {
      return 1;
    } else {
      return n * factCalculator(n - 1);
    }
  }
  public static void main(String args[]) {
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(factCalculator(number));
  }
}

출력:

Enter a number:
4
24

Java에서 동적 접근 방식을 사용하여 계승 찾기

동적 계획법 접근 방식을 사용하여 숫자의 계승을 계산할 수도 있습니다. 이 방법은 작은 수의 계승을 저장하고 그 계승을 사용하여 큰 수의 계승을 계산하므로 다른 방법보다 빠릅니다.

예를 들어:

  • 5! = 5 X 4!
  • 4! = 4 X 3!
  • 3! = 3 X 2!
  • 2! = 2 X 1!
  • 1! = 1 X 0!
  • 0! = 1

이 방법에서는 조회 테이블을 만듭니다. 이 테이블은 0부터 20까지의 숫자의 계승을 저장합니다.

팩토리얼 long이 저장할 수 있는 가장 큰 숫자이기 때문에 20까지 조회 테이블을 만들었습니다. 0!1로 초기화했다.

그런 다음 0! 값을 사용했습니다. 1!, 1!의 값을 계산하려면 2!를 계산하려면 등등. 아래 코드를 보세요.

import java.util.*;
public class SimpleTesting {
  static long[] factCalculator() {
    long[] fact_table = new long[21];
    fact_table[0] = 1;
    for (int i = 1; i < fact_table.length; i++) {
      fact_table[i] = fact_table[i - 1] * i;
    }
    return fact_table;
  }
  public static void main(String args[]) {
    long[] table = factCalculator();
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(table[number]);
  }
}

출력:

Enter a number: 
5
120

Java에서 Apache Commons를 사용하여 팩토리얼 찾기

Apache Commons Math 라이브러리로 작업하는 경우 factorial() 메소드와 함께 CombinatoricsUtils 클래스를 사용하십시오. 임의의 숫자의 계승을 계산하는 기본 제공 방법입니다.

이 메서드에서 반환된 값은 긴 형식입니다. 따라서 20보다 큰 숫자의 계승을 계산할 수 없습니다. 아래 예를 참조하십시오.

import java.util.Scanner;
import org.apache.commons.math3.util.CombinatoricsUtils;
public class SimpleTesting {
  static long factCalculator(int n) {
    return CombinatoricsUtils.factorial(n);
  }
  public static void main(String args[]) {
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(factCalculator(number));
  }
}

출력:

Enter a number: 
5
120

Java 8 스트림을 사용하여 팩토리얼 찾기

Java 8 스트림 API를 사용하여 숫자의 계승을 계산할 수도 있습니다. 먼저 1에서 n까지의 숫자 스트림을 생성합니다. 여기서 n은 계승이 계산되는 숫자입니다.

그런 다음 요소에 대한 축소 작업을 수행하기 위해 reduce 메서드를 사용합니다. 식별 요소로 1을 전달하고 연관 누적 함수로 곱셈을 전달했습니다.

아래 코드를 보세요.

import java.util.*;
import java.util.stream.LongStream;
public class SimpleTesting {
  static long factCalculator(int n) {
    return LongStream.rangeClosed(1, n).reduce(1, (long num1, long num2) -> num1 * num2);
  }
  public static void main(String args[]) {
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(factCalculator(number));
  }
}

출력:

Enter a number: 
5
120

반복적이거나 재귀적인 방법보다 reduce() 함수를 사용하면 큰 이점이 있습니다. reduce() 작업은 요소를 처리하는 데 사용되는 함수가 연관되어 있는 경우 병렬화할 수 있습니다.

이제 20 이상의 숫자의 계승을 계산합니다.

Java에서 BigInteger를 사용하여 팩토리얼 찾기

BigInteger 클래스는 기본 데이터 유형의 범위를 넘어서는 매우 큰 숫자를 처리하는 데 사용됩니다. BigInteger를 사용하여 20 이상의 숫자 계승 값을 저장할 수 있습니다.

아래 예를 참조하십시오.

import java.math.BigInteger;
import java.util.Scanner;

public class SimpleTesting {
  static BigInteger factCalculator(int n) {
    BigInteger store_fact = BigInteger.ONE;
    for (int i1 = 2; i1 <= n; i1++) {
      store_fact = store_fact.multiply(BigInteger.valueOf(i1));
    }
    return store_fact;
  }
  public static void main(String args[]) {
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(factCalculator(number));
    scan.close();
  }
}

출력:

Enter a number:
50
30414093201713378043612608166064768844377641568960512000000000000

* 연산자를 사용하여 BigInteger를 곱할 수 없으므로 multiply() 함수를 사용합니다. 이 방법은 long 대신 BigInteger를 사용한다는 점을 제외하면 반복 방법과 같습니다.

BigIntegerMath 라이브러리를 사용하여 계승 찾기

BigIntegerMath 라이브러리에는 숫자의 계승을 계산하는 데 사용할 수 있는 내장 factorial() 메서드가 있습니다. 정적 메서드이며 long 형식 값을 반환합니다.

아래 예를 참조하십시오.

import com.google.common.math.BigIntegerMath;
import java.util.*;
public class SimpleTesting {
  static long factCalculator(int n) {
    return BigIntegerMath.factorial(n);
  }
  public static void main(String args[]) {
    int number;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter a number: ");
    number = scan.nextInt();
    System.out.println(factCalculator(number));
  }
}

출력:

Enter a number:
50
30414093201713378043612608166064768844377641568960512000000000000

관련 문장 - Java Math