#05 #JAVA 팩토리얼 배우기

서영·2025년 5월 15일
1

JAVA

목록 보기
3/6
post-thumbnail

질문

Q. 정수를 입력 받고, 1~n까지 곱한 값을 출력할 때, 입력 받은 수보다 작은 1~n까지 곱한 값 중 가장 큰값을 출력하고 n을 구한다.

코드

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        System.out.printf("수 입력: ");
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt(); 
        int fac = 1; 
        int last=1; 
        int lastfac=1; 

        for (int i = 1; ; i++) {
            fac *= i;
         
            if (fac >= num) { 
                System.out.println("1~"+i+"까지의 곱: "+fac) ;
                break;
            }
            if( fac <= num) {
                last =i ;
                lastfac = fac;
            }
            System.out.println("1~"+i+"까지의 곱: "+fac);
        }
        System.out.println("---------");
        System.out.println("1~"+last+"까지의 곱: "+lastfac);
    }
}

1️⃣ 변수의 뜻
num - 입력 받는 값
i - 팩토리얼을 몇번 반복할 것인가, 몇 팩인지를 나타내는 값
fac - i 팩의 값을 나타내는 값
last - 맨 마지막에 출력되는 몇 팩를 나타내는 값
lastfac - 맨 마지막에 출력되는 팩의 값

2️⃣코드 설명(1)

for (int i = 1; ; i++) { 
            fac *= i; 
         
            if (fac >= num) {    ➡️ 팩토리얼이 입력한 값보다 크거나 같다면, (입력된 값보다 큰 팩토리얼 중에 가장 작은 값을 출력하기 위해서 사용 & 마지막 한번만 사용함) 
                System.out.println("1~"+i+"까지의 곱: "+fac) ;    ➡️ 입력된 값보다 큰 팩토리얼 중애 가장 작은 값을 출력해줌)
                break;    ➡️ 출력한 후에 For 문을 나오게 해줌 (더이상 더 큰 팩토리얼이 출력되지 ❌ )
            
            if( fac <= num) {    ➡️ 팩토리얼이 입력한 값보다 작거나 같으면 if 문을 실행시킴 (입력한 값보다 작거나 같은 값을 모두 출력하기 위해서)
                last =i ;    ➡️ i 값(ㅇ팩이 하나씩 증가할 떄 마다 하나씩 늘어나는 수)를 대입해줌
                lastfac = fac;    ➡️ i팩일 때 팩토리얼의 값을 i 값이 하나 증가할 때 마다 대입함
            }
            System.out.println("1~"+i+"까지의 곱: "+fac);    ➡️ i 값이 하나하나 늘어날 때 마다 몇 팩인지, 팩의 값은 무엇인질 나타내줌
    }

3️⃣코드 설명(2)

System.out.println("---------"); ➡️ 경계선을 입력해줌
System.out.println("1~"+last+"까지의 곱: "+lastfac); ➡️ 입력된 값보다 작지만 그 중에선 가장 큰 최댓값을 출력해줌

코드 (break 없는 버전)

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        System.out.printf("수 입력: ");
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt(); //입력을 받음
        int fac = 1; //팩토리얼을 뜻함
        int last=1; //입력한 수보다 작은 가장 큰 팩토리얼을 뜻함
        int lastfac=1; //입력한 수보다 작은 가장 큰 팩토리얼의 값을 뜻함

        for (int i = 1; fac<=num; i++) {
            
            if (i>1) {
                fac *= i; //팩토리얼을 나타냄
            }
            
            System.out.println("1~"+i+"까지의 곱: "+fac) ;
            
            if( fac <= num) {
                last =i ;
                lastfac = fac;
            }
        }
        System.out.println("---------");
        System.out.println("1~"+last+"까지의 곱: "+lastfac);
    }
}

1️⃣ 변수의 뜻
num - 입력 받는 값
i - 팩토리얼을 몇번 반복할 것인가, 몇 팩인지를 나타내는 값
fac - i 팩의 값을 나타내는 값
last - 맨 마지막에 출력되는 몇 팩를 나타내는 값
lastfac - 맨 마지막에 출력되는 팩의 값

2️⃣코드 설명(1)

for (int i = 1; fac<=num; i++) {   ➡️팩토리얼을 반복할 횟수는 for문이 돌며 1씩 증가하는 반복문 & 팩토리얼의 값이 입력받은 값보디 같거나 작을 때에 반복됨.
            
        if (i>1) {   ➡️i가 1보다 큰 수일 때에 반복 (처음부터 계속 동고 있음)
                fac *= i;   ➡️팩토리얼을 만들어줌
       }
            
       System.out.println("1~"+i+"까지의 곱: "+fac) ;   ➡️i 부터 i번 반복한 팩토리얼을 출력함. 
       
      if( fac <= num) {  ➡️팩토리얼이 입력한 수보다 작거나 같을 때
       	last =i ;   ➡️last라는 우리가 원하는 출력하고 싶은 값을 도출해내기 위한 변수에 i 값을 대입한다 (마지막에 원하는 결과 얻을 수 있음)
        lastfac = fac;   ➡️lastfac라는 우리가 원하는 출력하고 싶은 값을 도출해내기 위한 변수에  fac 대입한다 (마지막에 원하는 결과 얻을 수 있음)
      }
}
      

💡💡💡 i 팩의 펙토리얼이 입력한 값보다 크면 뒤에 있는 if절에 해당하지않기 때문에 last, lastfac 변수에는 입력한 값보다 작거나 같은 값 만이 대입 됨!

3️⃣코드 설명(2)

System.out.println("---------"); ➡️ 경계선을 입력해줌
System.out.println("1~"+last+"까지의 곱: "+lastfac); ➡️ 입력된 값보다 작지만 그 중에선 가장 큰 최댓값을 출력해줌.

0개의 댓글