728x90
▶ 백준 1676 - 팩토리얼 0의 개수
▶ 풀이방법
- 문제에서 N은 0~500으로 N팩토리얼 표현하면 long형 값을 넘어가서 표현불가.(25부터 long형값 범위 넘어감.)
- 따라서 밑의 코드는 오답이 됨.
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int num = 1;
if(n > 2) {
for(int i = 2; i <= n; i++) num *= i;
}else num = n;
String str = String.valueOf(num);
bw.write(str);
int result = 0;
for(int i = str.length()-1; i >= 0; i--) {
if(str.charAt(i) == '0') {
result++;
}else {
bw.write(String.valueOf(result));
break;
}
}
bw.flush();
bw.close();
br.close();
}
}
- 다른 해결방법(2와 5의 쌍으로 10의 배수 만들어 0의 개수 판별하는 방식)
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int n2 = 0;
int n5 = 0;
//2와 5의 곱 개수 세기
for(int i = 2; i <= n; i++) {
int num = i;// 없으면 시간초과 발생
while(num % 2 == 0) { //소인수 분해하여 2 개수 구하기
n2++;
num /= 2;
}
while(num % 5 == 0) { //소인수 분해하여 5 개수 구하기
n5++;
num /= 5;
}
}
bw.write(String.valueOf(Math.min(n2, n5)));
bw.flush();
bw.close();
br.close();
}
}
+나한테는 어려웠음,,ㅜ
728x90