I've just finished solving Problem 16. It was a fairly straightforward problem, and at first I couldn't decide how I wanted to solve it, so I decided to do it both ways and compare them. Here's the script w/ both versions of the solution:
import math def pure_numeric_sum_of_digits(num): """ Finds the sum of the digits in num (presumed to be base-10). This version of the method operates purely on numbers. >>> pure_numeric_sum_of_digits(2 ** 15) 26 """ running_total = 0 for n in xrange(int(math.log10(num)) + 1): running_total += num % 10 num //= 10 return running_total def string_based_sum_of_digits(num): """ Finds the sum of the digits in num (presumed to be base-10). This version of the method works by using a string representation of num and converting individual characters to numbers so we can operate on it as a sequence. >>> string_based_sum_of_digits(2 ** 15) 26 """ sum([int(digit) for digit in str(num)]) def problem_16(): """Solves Problem 16 at Project Euler.""" return string_based_sum_of_digits(2 ** 1000) if __name__ == '__main__': print problem_16()
string-based solution is more compact, but it has to be slower, right?
Strings are slower than
ints and all that. Thanks to the optimization efforts of the Python implementers, the string-based solution is actually ~167% faster on my machine (I used cProfile on a 10000-iteration loop to make these measurements).
Back to flipping out...