숫자 1406357289은 0 ~ 9 팬디지털인데, 부분열에 관련된 재미있는 성질을 가지고 있습니다.
d1을 첫째 자리수, d2를 둘째 자리수...라고 했을 때, 다음과 같은 사실을 발견할 수 있습니다.
- d2 d3 d4 = 406 → 2로 나누어 떨어짐
- d3 d4 d5 = 063 → 3으로 나누어 떨어짐
- d4 d5 d6 = 635 → 5로 나누어 떨어짐
- d5 d6 d7 = 357 → 7로 나누어 떨어짐
- d6 d7 d8 = 572 → 11로 나누어 떨어짐
- d7 d8 d9 = 728 → 13으로 나누어 떨어짐
- d8 d9 d10 = 289 → 17로 나누어 떨어짐
위와 같은 성질을 갖는 0 ~ 9 팬디지털을 모두 찾아서 그 합을 구하면 얼마입니까?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | def subset(list, size): if size == 0 or not list: return [list[:0]] else: result =[] for i in range(len(list)): pick = list[i:i+1] rest = list[:i] + list[i+1:] for x in subset(rest, size-1): result.append(pick+x) return result def isPartCheck(List, length): cal = [2, 3, 5, 7, 11, 13, 17] boolean = False for i in range(1, len(cal)+1): mul = 100 sum = 0 for j in List[i:i+3]: sum += mul*j mul /= 10 if sum % cal[i-1] == 0: boolean = True else: boolean = False break return boolean def summing(target): # summing each a cipher elements mul = 10 ** (len(target)-1) sum = 0 for i in target: sum += i * mul mul /= 10 return sum List = subset([0,1,2,3,4,5,6,7,8,9], 10) result = 0 for el in List: if isPartCheck(el, 10): print el tmp = summing(el) print tmp result += tmp print result | cs |
'* Computer Science > Project Euler' 카테고리의 다른 글
project euler 44. problem (0) | 2016.10.18 |
---|---|
project euler 37. problem (0) | 2016.10.13 |
Permutation (0) | 2016.09.30 |
project euler 42. problem (0) | 2016.09.23 |
project euler 40. problem (0) | 2016.09.22 |