프로젝트 오일러 30번
각 자리 숫자를 5제곱해서 더하면 자신과 같아지는 수는? 이들을 모두 더하면?
9**5 = 59049
따라서, 7자리 수는 조건을 만족할 수 없다. 최대 6자리.
a = [x**5 for x in range(10)]
b = {a1+a2+a3+a4+a5+a6 for a1 in a for a2 in a for a3 in a for a4 in a for a5 in a for a6 in a if a1<=a2<=a3<=a4<=a5<=a6}
print sum([n for n in b if sum([int(x)**5 for x in str(n)]) == n]) - 1
마지막에 1을 뺀 건, 위의 코드를 실행하면 마지막 리스트에 0과 1도 포함되기 때문이다.
파이썬의 장점 list comprehension 을 좀 더 써 보면,
print sum([n for n in range(2,9**5 *5) if sum([int(x)**5 for x in str(n)]) == n])
처음코드보다 오래 걸린다. int(x)**5를 매번 계산하는 걸 빼면..
fifth = {str(x):x**5 for x in range(10)}
print sum([n for n in range(2,9**5 *5) if sum([fifth[x] for x in str(n)]) == n])
좀 나아지지만, 처음만큼 빠르지는 않다.
No comments:
Post a Comment