Java에서 계승을 계산하는 방법
- Java의 반복적 방법을 사용하여 계승 가져오기
- Java에서 재귀 메서드를 사용하여 계승 찾기
- Java에서 동적 접근 방식을 사용하여 계승 찾기
- Java에서 Apache Commons를 사용하여 팩토리얼 찾기
- Java 8 스트림을 사용하여 팩토리얼 찾기
-
Java에서
BigInteger
를 사용하여 팩토리얼 찾기 -
BigIntegerMath
라이브러리를 사용하여 계승 찾기
이 자습서에서는 Java에서 계승을 계산하는 방법과 코드 예제를 소개합니다.
숫자 n
의 계승은 1
과 n
사이의 모든 자연수의 곱입니다. 이 튜토리얼에서는 숫자의 계승을 계산하는 다양한 방법을 볼 것입니다.
먼저 20
과 같은 숫자의 계승을 계산하는 방법을 살펴보겠습니다. 이러한 분리는 Java의 제한된 범위의 긴 데이터 유형 때문입니다.
20
이상의 숫자의 계승은 너무 커서 long 범위에 맞지 않습니다.
Java의 반복적 방법을 사용하여 계승 가져오기
이 예에서는 긴 유형의 변수 store_fact
를 만들고 1
로 초기화했습니다.
그런 다음 1
부터 계승이 계산된 숫자까지 모든 정수를 반복하고 루프 변수 값을 store_fact
값과 곱합니다. 계산된 값을 store_fact
변수에 저장하고 루프 변수를 업데이트했습니다.
위의 알고리즘을 더 명확하게 하기 위해 다음과 같이 작성할 수 있습니다.
n
초기화store_fact = 1
초기화for i = 1
을n
으로 변경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