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

오일러 프로젝트 06

1부터 10까지 자연수를 각각 제곱해 더하면 다음과 같습니다 (제곱의 합).
1^2 + 2^2 + … + 10^2 = 385

1부터 10을 먼저 더한 다음에 그 결과를 제곱하면 다음과 같습니다 (합의 제곱).
(1 + 2 + … + 10)^2 = 55^2 = 3025

따라서 1부터 10까지 자연수에 대해 “합의 제곱”과 “제곱의 합” 의 차이는 3025 – 385 = 2640 이 됩니다. 그러면 1부터 100까지 자연수에 대해 “합의 제곱”과 “제곱의 합”의 차이는 얼마입니까? (http://euler.synap.co.kr/prob_detail.php?id=6)

접근

1부터 100까지를 제곱한 수의 합과, 1부터 100까의 합의 제곱의 차이를 구하는 문제로, 식을 그대로 코딩하기만 하면 되는 문제이다.

print(abs(sum(range(101) ** 2) - sum(x**2 for x in range(101))))

보통은 제곱의 합보다는 합의 제곱이 훨씬 클 것이므로 순서를 잘 지키면 abs() 함수는 사용하지 않아도 좋다.

참고

연속한 자연수의 합은 다음 공식을 통해서 쉽게 구할 수 있다.

\sum_{k=1}^{n} k^ = \frac{n(n + 1)}{2}

연속한 자연수의 거듭제곱의 합은 다음 공식을 통해서 구할 수 있다.

\sum_{k = 1}^{n} k^2 = \frac{n(n + 1)(2n + 1)}{6}

따라서, 합의 제곱과 제곱의 합은 다음과 같이 계산할 수 있다.

n = 100
n * (n + 1) * ( n * 2 + 1) // 6 - (n ** 4 + 2 * n ** 3 + n ** 2) // 4

이 공식들은 간단한 루프를 제거할 수 있는 공식이기 때문에 알아두면 나중에 다 쓸모가 있을 것이다.