def singular_plural(valor):
    if valor == 1:
        return ''
    return 's'

def juntar(textos):
    if len(textos) == 1:
        return textos[0]
    return ', '.join(textos[:-1]) + ' e ' + textos[-1]

while True:
    try:
        n = int(input('Digite um número menor que 1000 (ou zero para encerrar): '))
        if n == 0: # incluí essa condição para encerrar o programa
            break # sai do while
        if 0 < n < 1000: # deveria aceitar números negativos? Estou assumindo que não
            # não precisa transformar em string, é uma volta desnecessária
            # use apenas matemática
            unidade = n % 10
            dezena = (n // 10) % 10
            centena = n // 100
            # textos para centena, dezena e unidade
            textos = []
            if centena != 0:
                textos.append(f'{centena} centena{singular_plural(centena)}')
            if dezena != 0:
                textos.append(f'{dezena} dezena{singular_plural(dezena)}')
            if unidade != 0:
                textos.append(f'{unidade} unidade{singular_plural(unidade)}')

            print(f'O número {n} tem {juntar(textos)}')
        else:
            print('O número deve ser menor que 1000 e não pode ser negativo, tente novamente')
    except: # se não digitar número, cai aqui no except
        print('Vc não digitou um número, tente novamente')

print('fim')