* Computer Science/Project Euler

project euler 44. problem

soicem 2016. 10. 18. 16:42

오각수는 Pn = n (3n − 1)/2 라는 공식으로 구할 수 있고, 처음 10개의 오각수는 다음과 같습니다.

1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

위에서 P4 + P7 = 22 + 70 = 92 = P8이 됨을 볼 수 있습니다. 하지만 두 값의 차인 70 − 22 = 48 은 오각수가 아닙니다.

합과 차도 모두 오각수인 두 오각수 Pj, Pk 에 대해서, 그 차이 D = | Pk − Pj | 는 가장 작을 때 얼마입니까?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
list =[]
result = []
 
for n in range(13000):
    list.append((n*(3*n-1))/2)
cnt = 0
for n1 in list:
    cnt +=1
    for n2 in list[cnt:]:
        if list.count(n1 + n2):
            if list.count(n2 - n1):
                print n2, n1, "n2 - n1 :", n2-n1, '-------------------'
                result.append(n2-n1)
print result
 
cs

 처음 문제를 봤을 때 2개의 루프를 만들기 싫어서 한 루프 안에서 처리할 궁리를 했지만 p4 + p7이 p7을 넘어가는 부분 때문에 오각수를 담는 리스트를 만들었습니다.
 count로 해당 수가 오각수이면 1을 반환할 것이고 숫자가 커질수록 n2-n1이 커지기 때문에 임의로 정한 범위를 초과하는 테스트는 필요없습니다.  여러개의 오각수가 나온다면 그 중 가장 작은 수를 고르면 될 것이라 생각했습니다.

7042750 1560090 n2 - n1 : 5482660 -------------------
[5482660]


'* Computer Science > Project Euler' 카테고리의 다른 글

project euler 52. problem  (0) 2016.11.14
project euler 41.problem  (0) 2016.10.20
project euler 37. problem  (0) 2016.10.13
project euler 43. problem  (0) 2016.10.05
Permutation  (0) 2016.09.30