- 2x3 , 2+3이 있을 때 product와 sum의 차이는 1이기 때문에 양쪽에 각각 1을 곱하고 더하면 1x2x3 == 1+2+3 이된다. 즉 product와 sum이 같은 3개의 숫자를 구할 수 있다.
- 수를 계속 증가시키면서 factorization한 후 product와 sum의 차이만큼 양쪽에 1을 더하고 곱하면 product와 sum이 같은 set을 구할 수 있다.
#!/usr/bin/env python #-*- coding:utf-8 -*- import math import operator """Project Euler Problem 88""" d = {} c = set(range(2, 12000+1)) def factorizations(n): answer = [] def sub(n, factor=2, factors=[]): for x in range(factor, int(math.sqrt(n))+1): if n % x == 0: sub(n/x, x, factors + [x]) answer.append(factors + [n]) sub(n) return answer def func(l): s = reduce(operator.add, l) m = reduce(operator.mul, l) length = len(l) + (m-s) if length not in d.keys(): d[length] = m c.discard(length) print '%6d %6d %s' % (len(c), length, m) def solve(limit=12000): n = 4 while c: map(func, factorizations(n)) n += 1 return reduce(operator.add, set( [d[x] for x in range(2, limit+1)] )) if __name__ == '__main__': solve()
댓글 없음:
댓글 쓰기