콘텐츠로 건너뛰기
Home » 오일러 프로젝트 20

오일러 프로젝트 20

n! 이라는 표기법은 n × (n − 1) × … × 3 × 2 × 1을 뜻합니다.
예를 들자면 10! = 10 × 9 × … × 3 × 2 × 1 = 3628800 이 되는데,
여기서 10!의 각 자리수를 더해 보면 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 입니다.

100!의 자리수를 모두 더하면 얼마입니까?

http://euler.synap.co.kr/prob_detail.php?id=20

접근

팩토리얼 함수는 연속된 자연수들을 곱하는 함수로 reduce() 함수를 이용하면 간단하게 구현할 수 있다.

fac = lambda n: 1 if n < 2 else reduce(lambda x, y: x * y, range(1, n + 1))

큰 정수를 바로 계산해서 답을 구하는 경우, 다음과 같이 간단하게 해결할 수 있다.

print(sum(map(int, str(fac(100)))))

약간 귀찮은 풀이

16번 문제를 풀면서 작성한 문자열을 사용한 곱셈함수인 s_multi() 를 사용해서도 풀 수 있다. 같은 알고리듬을 활용하면 큰 정수를 지원하지 않는 다른 언어에서도 활용할 수 있다.

# xs : 1 ~ 100 사이의 자연수를 표현하는 리스트
xs = [str(n + 1) for n in range(100)]
# xs를 모두 곱하여 100!을 계산하고, 그 결과의 각 자리 수를 더함.
s = reduce(s_multi, xs)
print(sum(map(int, s)))