프로젝트 오일러 48

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

프로젝트 오일러 48

1^1 + 2^2 + 3^3 + ... + 1000^{1000} 의 마지막 10자리는?

문제 자세히 보기: [국어] [영어]

이 문제 역시 아주 큰 숫자를 다루는 문제지만, Java의 BigInteger나 Clojure의 BigInt를 쓰면 쉽게 풀 수 있다.

계산은 복잡하지 않다. 그냥 1부터 1000까지 루프를 돌며 n^n 을 구해 모두 더한 다음 mod를 이용해 마지막 10자리를 구하면 된다. pow 메서드가 있는 Java의 BigInteger 클래스를 사용하는 게 좀 더 편하겠다.

(defn solve []
  (->> (range 1 (inc 1000))
       (map biginteger)
       (map #(.pow % %))
       (apply +')
       (#(mod % 10000000000))))

실행 결과는 다음과 같다.

p048=> (time (solve))
"Elapsed time: 11.002665 msecs"
9110??6700N

물론 이렇게 푸는 것은 문제의 의도를 회피한 것이겠지만, BigInteger를 사용하지 않고 큰 수를 다루는 방법은 문제 20, 16, 13에서 충분히 시도해 봤으므로, 여기서는 생략한다.

참고