I just tried three different methods in Python 3.5...

Converting the int to a string and then checking if it has a '0' in it was fastest by far.

Using divmod() was almost 4x slower than the string method.

Modulus plus integer (or 'floor') division was a bit better than divmod, probably because it doesn't have the extra function call overhead.

I was surprised that the string conversion plus lookup was so much more efficient than the pure integer mathematical tests (including some simple optimizations I added).

import time class Solution(object): def numsWithZeroesV1(self, n): """ :type n: int :rtype: int """ cnt = 0 for i in range(1, n+1): if '0' in str(i): cnt += 1 return cnt def numsWithZeroesV2(self, n): """ :type n: int :rtype: int """ cnt = 0 for i in range(1, n+1): r = i while r > 0: r, mod = divmod(r, 10) if mod == 0: cnt += 1 break return cnt def numsWithZeroesV3(self, n): """ :type n: int :rtype: int """ cnt = 0 for i in range(1, n+1): r = i while r > 0: mod = r % 10 if mod == 0: cnt += 1 break r //= 10 return cnt def testit(n): t_0 = time.time() r = s.numsWithZeroesV1(n) t_1 = time.time() print('V1', t_1-t_0, n, r, r/n) r = s.numsWithZeroesV2(n) t_2 = time.time() print('V2', t_2-t_1, n, r, r/n) r = s.numsWithZeroesV3(n) t_3 = time.time() print('V3', t_3-t_2, n, r, r/n)