#문제
1676번: 팩토리얼 0의 개수
https://www.acmicpc.net/problem/1676
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
#접근방법
N!은 1부터 N까지의 숫자의 곱을 의미한다. N!의 0의 개수를 구하려면 10의 약수인 2와 5의 개수를 먼저 구해줘야한다.
반응형
#풀이
#include <stdio.h>
int main(){
int n;
int a=0,b=0;
int ans;
scanf("%d",&n);
for(int i=2;i<=n;i++){
int x = i;
while(x%2==0){
x/=2;
a++;
}
while(x%5==0){
x/=5;
b++;
}
}
if(a<b) ans = a;
else ans = b;
printf("%d",ans);
return 0;
}
위에서 설명했듯이 10의 약수인 2와 5의 개수를 먼저 구해줘야한다. 그리고 2와 5의 개수 중 작은 값을 출력하면 정답이다.
N!의 0의 개수는 10이 얼마나 곱해져 있는지를 구하는 문제랑 같기 때문이다.
먼저 scanf로 n을 입력받고 2부터 n까지 for문을 돌아준다.
그리고 i값을 직접 나누면 for문의 조건이 이상해지므로 변수 x에 i값을 넣어주어서
while반복문에서 x가 2로 나눠질 경우, x가 5로 나눠질 경우에 x를 나눠주면서 2와 5의 개수를 a,b에 각각 저장시켜준다.
그리고 a와 b중 작은 값을 ans에 저장하고 출력하면 정답이다.
#성능
#정리
N!이 어떤의미를 가지고 있는지 아는 것,
N!의 0의 개수는 10이 얼마나 곱해져 있는지 구하는 것을 알고 있다면 쉽게 풀 수 있는 문제였다.
'하루 한 문제' 카테고리의 다른 글
[백준] 1764번 : 듣보잡 [C/C++] (0) | 2022.06.19 |
---|---|
[백준] 11723번 : 집합 [C/C++] (0) | 2022.06.18 |
[백준] 17144번 : 미세먼지 안녕! [C/C++] (0) | 2022.05.30 |
[백준] 14938번 : 서강그라운드 [C/C++] (0) | 2022.05.27 |
[백준] 11404번 : 플로이드 [C/C++] (0) | 2022.04.12 |