Quantos zeros tem entre um e mil?
É mais fácil responder perguntas desse tipo escrevendo pequenos programas usando o suporte a programação funcional e compreensão de lista que algumas linguagens como Python oferecem.
Para contar os zeros de um número, transformamos ele em uma string e contamos quantas substrings ‘0’ ele contém. Por exemplo o 800:
str(800).count('0')
# 2
Para gerar uma lista ordenada com os elementos do intervalo entre um e mil, inclusive os valores um e mil:
xrange(1,1001)
# [1, 2, ... , 999, 1000]
Pegamos esse intervalo e geramos uma outra lista onde cada elemento é a contagem dos zeros do número do intervalo.
[str(x).count('0') for x in xrange(1,1001)]
# [0, 0, ... , 0, 3]
Por exemplo, 1 não tem nenhum zero. Dois também não. 999 também não. 1000 tem três.
Somamos todos os elementos da lista temos o número de algarismos zero entre um e mil.
sum([str(x).count('0') for x in xrange(1,1001)])
E a resposta é 192.
O mesmo poderia ser obtido contando quantos zeros há na representação de string da lista do intervalo.
str(range(1,1001)).count('0')
Mas essa abordagem apesar de menor é menos geral se você quiser modifica-la para contagens mais complexas.
A diferença do range pro xrange é que o range constrói a lista real do intervalo real em memória e o xrange uma representação da lista do intervalo. Em geral mas não sempre, a performasse do xrange é melhor.
De toda forma, em ambos os casos, o resultado é o mesmo.