CodeGym/Java Blog/무작위의/계승을 위한 자바 프로그램
John Squirrels
레벨 41
San Francisco

계승을 위한 자바 프로그램

무작위의 그룹에 게시되었습니다
회원
오늘 우리는 계승과 계승을 찾는 가장 일반적인 방법에 대해 이야기할 것입니다. 이것은 프로그래머가 알고 작업할 수 있어야 하는 가장 기본적인 기능 중 하나입니다. 글쎄, 시작하자. n!으로 표시되는 숫자 n의 계승은 1에서 n까지의 모든 자연수의 곱(곱셈) 값입니다. 다음과 같이 표시됩니다(수학 지식을 새롭게 합시다).
1! = 1 2! = 1 * 2 = 2 3! = 1 * 2 * 3 = 6 4! = 1 * 2 * 3 * 4 = 24 5! = 1 * 2 * 3 * 4 * 5 = 120
그리고 0에 대한 작은 규칙이 하나 더 있습니다.
!0 = 1
6의 차이를 계산하고 싶다면! 그리고 4!:
6!-4! = 1⋅2⋅3⋅4⋅5⋅6 - 1⋅2⋅3⋅4 = 720 - 24 = 696
이것이 프로그래밍에서 구현될 때 어떻게 보이는지 봅시다. Java에서 계승 계산을 수행하는 방법에 대한 몇 가지 방법을 살펴보겠습니다.

계승 프로그램의 일반 솔루션

다음은 루프를 사용하는 간단한 계승 프로그램입니다.
class FactorialExample{
 public static void main(String args[]){
  int i,fact=1;
  int number=7;// our number to do the necessary calculations in class Factorial
  for(i=1;i<=number;i++){
      fact=fact*i;
  }
  System.out.println("Factorial of "+number+" is: "+fact);
 }
}
콘솔의 출력은 다음과 같습니다.
7의 계승: 5040
그리고 정리를 위한 또 하나의 예:
public static int getFactorial(int f) {
  int result = 1;
  for (int i = 1; i <= f; i++) {
     result = result * i; // finding factorial of number using loops
  }
  return result;
}
여기서 어려운 것은 없습니다. 전달된 숫자를 루프의 크기로 사용하고 f에 도달할 때까지 모든 이전 숫자를 곱합니다. 그리고 메인에서:
System.out.println(getFactorial(6) - getFactorial(4));
코드를 테스트하면 원하는 결과인 696을 얻는 것을 볼 수 있습니다.

재귀 솔루션

재귀는 메서드가 자신을 호출할 때 발생합니다. 이러한 방법을 재귀 방법이라고 합니다. 원칙적으로 두 부분으로 구성됩니다.
  1. 종료 조건 — 종료 조건이 충족되면 메서드는 자신을 호출하는 것을 중지하고 값을 전달하기 시작해야 합니다. 결국 종료 조건이 없으면 StackOverflowError 를 얻을 때까지 메서드가 반복적으로 자신을 호출하는 무한 루프를 갖게 됩니다 .
  2. 상황에 필요한 논리와 재귀 호출이 필요하지만 입력 값이 다릅니다.
Java에서 계승을 찾는 것은 재귀를 사용하는 경우의 완벽한 예입니다.
public static int getFactorial(int f) { // finding factorial of number using recursive solution
  if (f <= 1) {
     return 1;
  }
  else {
     return f * getFactorial(f - 1);
  }
}
재귀 종료 조건은 1에 도달할 때입니다. 매개변수가 1이 아니면 현재 값에 메서드에 대한 다음 재귀 호출의 결과를 곱합니다(현재 값에서 1을 뺀 값을 전달함).

스트림 솔루션

Java의 스트림 기능에 익숙하지 않거나 메모리를 새로고침하려는 사람은 여기에서 정보를 읽으면 도움이 될 것입니다 .
public static int getFactorial(int f) { // finding factorial of number using Stream
  if (f <= 1) {
     return 1;
  }
  else {
     return IntStream.rangeClosed(2, f).reduce((x, y) -> x * y).getAsInt();
  }
}
여기서는 int 값의 스트림으로 작업할 때 추가 기능을 제공하는 특수 IntStream 클래스를 사용합니다. 이러한 스트림을 생성하기 위해 정적 rangeClosed 메서드를 사용합니다. 이 메서드는 2에서 f까지의 값을 1씩 증분하여 생성합니다. 다음으로 reduce 메서드를 사용하여 모든 값을 결합합니다. 보다 구체적으로, 값을 결합하는 방법을 보여줍니다. 마지막으로 터미널 getAsInt 메서드를 사용하여 결과 값을 얻습니다.

BigInteger 사용

Java에서 BigInteger 클래스는 숫자, 특히 BIG 숫자를 처리하는 데 자주 사용됩니다. 실제로 int 를 사용하면 데이터 손실 없이 처리할 수 있는 최대 계승은 31입니다. 데이터 유형의 경우 최대 계승은 39입니다. 하지만 계승 100이 필요하면 어떻게 될까요? 이전 솔루션을 BigInteger에 적용해 보겠습니다.계승을 위한 Java 프로그램 - 2

일반 솔루션

public static BigInteger getFactorial(int f) { // finding factorial of number using BigInteger
  BigInteger result = BigInteger.ONE;
  for (int i = 1; i <= f; i++)
     result = result.multiply(BigInteger.valueOf(i));
  return result;
}
알고리즘은 기본적으로 동일하지만 여기서는 BigInteger의 기능을 사용합니다. BigInteger.ONE 은 시작 값 1이고, multiply() 는 이전 계승 값과 현재 숫자를 곱하는 데 사용됩니다.

재귀 솔루션

public static BigInteger getFactorial(int f) {
  if (f <= 1) {
     return BigInteger.valueOf(1);
  }
  else {
     return BigInteger.valueOf(f).multiply(getFactorial(f - 1));
  }
}
솔루션의 일반적인 논리는 BigInteger 작업을 위해 일부 메서드가 추가되었다는 점을 제외하면 변경되지 않습니다.

스트림 솔루션

public static BigInteger getFactorial(int f) {
  if (f < 2) {
     return BigInteger.valueOf(1);
  }
  else {
     return IntStream.rangeClosed(2, f).mapToObj(BigInteger::valueOf).reduce(BigInteger::multiply).get();
  }
}
모든 것이 본질적으로 동일하지만 BigInteger를 사용합니다. Stream 클래스는 우리에게 mapToObj 메서드를 제공하는데, 우리는 곱하기 메서드 를 사용하여 int 값을 BigInteger로 변환하기 위해 사용합니다 (그리고 get()은 선택적 래퍼 에서 개체를 가져오기 위해 추가되었습니다 ). 인수 100으로 이 세 가지 방법 중 하나를 실행하면 스택 오버플로를 방지하고 올바른 결과를 얻을 수 있습니다.
9332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651828625369792082722375825 1185210916864000000000000000000000000
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다