1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
첫째 줄에 구한 0의 개수를 출력한다.
코드
import sys
n = int(sys.stdin.readline())
sum = 1
ans = 0
if n==0:
print(0)
exit()
for a in range(1, n+1):
sum *= a
sum_str = str(sum)
for c in reversed(sum_str):
if c == '0':
ans+=1
else:
break
print(ans)
팩토리얼값을 계산한 뒤 그 값을 문자열로 변환하고 reversed()를 이용하여 뒤집어서 0이 아닌 숫자가 나올 때까지 순회한다.
reversed()는 반대방향으로 순회하는 iterator를 리턴해준다.
이렇게 하지 않고 슬라이싱을 이용하여 sum[::-1] 이렇게 해줄 수도 있다.
그리고 팩토리얼 계산도 factorial 함수가 있었다...math 라이브러리를 import 해준 뒤 math.factorial()로 사용 가능하다.
아무리 생각해도 이렇게 푸는거 아닐거 같아서 찾아봤는데 다양한 방법들이 있었는데 수학적으로 푼 게 인상적이었다.
10 = 2 X 5인데 짝수는 모두 2의 배수이므로 2는 충분히 많다 그러니까 소인수분해했을 때 5가 몇번 곱해졌는지를 구하면 답이 나오는 것이다. 5의 제곱인 25에는 5가 2번, 세제곱수인 125에는 3번 곱해지므로 이 점도 고려하여야 한다. 이렇게 푼다면 코드는 다음과 같다.
import sys
n = int(sys.stdin.readline())
print(n//5 + n//25 + n//125)
참고로 // 연산자는 나누기 연산 후 몫에서 소수점 이하의 수를 버리고, 정수 부분의 수만 구하는 연산자이다.
이런걸 왜 써주냐면 나도 파이썬하면서 처음 알아서....
수학의 중요성...
'문제풀이 > 기타' 카테고리의 다른 글
[Python] 백준 2166번 다각형의 면적 (0) | 2022.08.05 |
---|---|
[Python] 백준 11444번 피보나치 수 6 (0) | 2022.07.30 |
[Python/파이썬] 1225번 이상한 곱셈 (0) | 2021.11.28 |
[Python/파이썬] 백준 1015번 수열 정렬 (0) | 2021.11.02 |
[Python/파이썬] 백준 15650번 N과 M(2) (0) | 2021.08.11 |
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
첫째 줄에 구한 0의 개수를 출력한다.
코드
import sys n = int(sys.stdin.readline()) sum = 1 ans = 0 if n==0: print(0) exit() for a in range(1, n+1): sum *= a sum_str = str(sum) for c in reversed(sum_str): if c == '0': ans+=1 else: break print(ans)
팩토리얼값을 계산한 뒤 그 값을 문자열로 변환하고 reversed()를 이용하여 뒤집어서 0이 아닌 숫자가 나올 때까지 순회한다.
reversed()는 반대방향으로 순회하는 iterator를 리턴해준다.
이렇게 하지 않고 슬라이싱을 이용하여 sum[::-1] 이렇게 해줄 수도 있다.
그리고 팩토리얼 계산도 factorial 함수가 있었다...math 라이브러리를 import 해준 뒤 math.factorial()로 사용 가능하다.
아무리 생각해도 이렇게 푸는거 아닐거 같아서 찾아봤는데 다양한 방법들이 있었는데 수학적으로 푼 게 인상적이었다.
10 = 2 X 5인데 짝수는 모두 2의 배수이므로 2는 충분히 많다 그러니까 소인수분해했을 때 5가 몇번 곱해졌는지를 구하면 답이 나오는 것이다. 5의 제곱인 25에는 5가 2번, 세제곱수인 125에는 3번 곱해지므로 이 점도 고려하여야 한다. 이렇게 푼다면 코드는 다음과 같다.
import sys n = int(sys.stdin.readline()) print(n//5 + n//25 + n//125)
참고로 // 연산자는 나누기 연산 후 몫에서 소수점 이하의 수를 버리고, 정수 부분의 수만 구하는 연산자이다.
이런걸 왜 써주냐면 나도 파이썬하면서 처음 알아서....
수학의 중요성...
'문제풀이 > 기타' 카테고리의 다른 글
[Python] 백준 2166번 다각형의 면적 (0) | 2022.08.05 |
---|---|
[Python] 백준 11444번 피보나치 수 6 (0) | 2022.07.30 |
[Python/파이썬] 1225번 이상한 곱셈 (0) | 2021.11.28 |
[Python/파이썬] 백준 1015번 수열 정렬 (0) | 2021.11.02 |
[Python/파이썬] 백준 15650번 N과 M(2) (0) | 2021.08.11 |