Saturday, June 6, 2015

Project Euler #56 - powerful digit sum

프로젝트 오일러 56번 - 큰수의 숫자 합
a, b가 각각 100미만일 때, a^b의 각 자리의 수를 모두 더한 값의 최대값은?

a, b를 2부터 99까지 바꿔가면서 모두 계산해 보면 된다.
길게 쓰면,

mx = 0
for a in range(2,100):
    n = a
    for b in range(2,100):
        n *= a
        mx = max(mx, sum([int(x) for x in str(n)]))

print mx

짧게 쓰면,

print max([sum([int(x) for x in str(a**b)]) for a in range(2,100) for b in range(2,100)])

시간은 거의 같다. 각각 0.6초


좀 더 생각해 보면.. 4^8 의 자리수 합보다는 49^89의 합이 훨씬 큰 거다. 그럼 a, b를 2부터 99까지 움직이는 대신 90부터 99까지 움직여봐도 될 것 같다.

print max([sum([int(x) for x in str(a**b)]) for a in range(90,100) for b in range(90,100)])

0.14초. 당연한 얘기지만, 95부터 99까지 체크하는 걸로 바꾸면 더 줄어든다.

No comments: