오일러 프로젝트 06

오일러 프로젝트 6번

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)

문제 그대로를 풀면 되겠다. 파이썬 코드는 다음과 같다.

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

Swift에서는 거듭제곱 연산자가 없다. 흔히 ^로 대표되는 이 연산자는 Swift에서는 XOR 비트 연산이다.

따라서 좀 불편하더라도

let ar = Array(1...100)
let s1 = ar.map{$0 * $0}.reduce(0, +)
let s2 = ar.reduce(0, +) * ar.reduce(0, +)
print(s2 - s1)

이렇게 할 수 있다. Swift에서는 pow():(Double, Double)->Double 함수가 있다. 파이썬과 비슷하게 연산자 오버로딩을 통해서 작성해보면

infix operator ** { associativity left precedence 160 }
func ** (left: Double, right: Double) -> Double {
    return pow(left, right)
}

let a = Array(1...100)
let s1:Double = a.map{Double($0)}.reduce(0, +) ** 2
let s2:Double = a.map{return Double($0) ** 2}.reduce(0, +)
print(abs(s1 - s2))