반응형
문제
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
첫째 줄에 구한 0의 개수를 출력한다.
예제 입력 110 |
예제 출력 12 |
예제 입력 23 |
예제 출력 20 |
풀이
팩토리얼을 계산했을 때, 맨 뒷자리에 연속된 0이 몇 번 나오는지 세는 문제이다.
문제 설명에 소인수분해의 성질을 이용하라는 데에서 힌트를 얻었다.
보통 수의 끝자리에 0의 개수를 늘리기 위해서는 곱하기 10을 해주면 된다.
여기서 10은 2 * 5 꼴로 나타낼 수 있다.
이미 수를 소인수분해 했을 때 2의 개수가 5의 개수보다 많다면?
그냥 5만 곱해주면 된다.
여기서, 팩토리얼의 특성 상 소인수분해했을 때, 2의 개수가 5의 개수보다 항상 많으므로
해를 구하기 위해서는 그냥 소인수분해했을 때 5의 개수가 몇인지만 세면 된다.
단, 팩토리얼을 계산한 뒤 소인수분해하고 이를 세는건 성능상 매우 비효율적이므로
계산은 그냥 생략해버리고 곱할 때 5로 나누어 떨어지는 횟수만 세자 ㅎㅎ
count = 0
for i in range(int(input()) + 1):
while(i % 5 == 0 and i > 0):
count += 1
i //= 5
print(count)
반응형
'알고리즘 연습 > 정수론 및 조합론' 카테고리의 다른 글
[🥇1 / 백준 1016 / 파이썬] 제곱 ㄴㄴ 수 (0) | 2021.07.02 |
---|---|
[🥈2 / 백준 2004 / 파이썬] 조합 0의 개수 (0) | 2021.06.25 |
[🥈3 / 백준 9375 / 파이썬] 패션왕 신해빈 (0) | 2021.06.23 |
[🥈5 / 백준 1010 / 파이썬] 다리 놓기 (0) | 2021.06.23 |
[🥈1 / 백준 11051 / 파이썬] 이항 계수 2 (0) | 2021.06.23 |