질문
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); ➡️ 입력된 값보다 작지만 그 중에선 가장 큰 최댓값을 출력해줌.