Implemente uma função chamada conta_digitos( n ) que receba um número inteiro n e retorne a quantidade de dígitos que ele possui.
A função deve atender aos seguintes requisitos:
- Utilizar apenas estruturas de repetição (por exemplo, while) - não use conversão para str.
- Considerar corretamente o caso
.
- Desconsiderar o sinal em números negativos (isto é, conta_digitos(-230) deve retornar 3).
Exemplo de execução:
print(conta_digitos(50230))
# deve exibir 5
print(conta_digitos(-8))
# deve exibir 1
print(conta_digitos(0))
# deve exibir 1
A função deve atender aos seguintes requisitos:
| print(conta_digitos(50230)) | # deve exibir 5 |
| print(conta_digitos(-8)) | # deve exibir 1 |
| print(conta_digitos(0)) | # deve exibir 1 |
Passo 1
O que o enunciado pede e o que foi dado:
- Pedem uma função chamada
conta_digitosque recebe um inteiro. - A função deve retornar a quantidade de dígitos de
. - Regras importantes que devo obedecer:
- Usar apenas estruturas de repetição (por exemplo
while) — não posso converter parastr. - Tratar corretamente o caso
. - Ignorar o sinal quando
for negativo (por exemplo, ).
- Usar apenas estruturas de repetição (por exemplo
- Exemplos que o enunciado mostrou (para checagem de resultados):
-
deve retornar . -
deve retornar . -
deve retornar .
-
Passo 2
Ideia básica do método (explicação simples e por que funciona):
- Para contar dígitos sem converter para string, usamos divisão inteira por
. - Observação: quando dividimos um número inteiro positivo por
com divisão inteira (no Python: //), eliminamos o último dígito. Ex.:. - Repetindo isso e contando quantas vezes conseguimos dividir até
virar , obtemos o número de dígitos. - Exemplo conceitual: pegando
, -
(contador = 1) -
(contador = 2) -
(contador = 3) -
(contador = 4) -
(contador = 5) → paramos; resultado .
-
- Por isso o laço termina quando
fica igual a e o próprio número de iterações é a quantidade de dígitos.
Passo 3
Tratamento de sinais e do caso
:
- Se
for negativo, devemos “desconsiderar o sinal”. A forma mais direta é transformar em seu valor absoluto antes de contar: se então fazer . - Se
, o laço que divide por nunca rodaria (porque já começa em ), mas por definição tem 1 dígito. Então é um caso especial: se retornamos imediatamente.
Passo 4
Detalhes sobre a implementação com
while (passo a passo do algoritmo em pseudo-linguagem):- Receber
. - Se
então . - Se
então retornar . - Inicializar um contador em
. - Enquanto
: - Fazer
. - Incrementar o contador: contador
contador .
- Fazer
- Quando o laço terminar, retornar o contador.
Passo 5
Por que usamos divisão inteira
// e não divisão normal /:- A divisão normal
em muitas linguagens produz um número com parte fracionária (float). Para “remover” o último dígito queremos um inteiro. - A operação
//em Python faz divisão inteira (pisa a parte fracionária), exatamente o que precisamos para reduzirdígito a dígito sem usar strings.
Passo 6
Complexidade e comportamento em números grandes:
- Cada iteração elimina um dígito. Logo o número de iterações é proporcional ao número de dígitos de
. A complexidade é , onde é a quantidade de dígitos. - Usa memória constante (apenas algumas variáveis).
Passo 7
Implementação em Python (respeitando as restrições: apenas e negativos):
def conta_digitos(n):
# Desconsiderar o sinal
if n < 0:
n = -n
# Caso especial: zero tem 1 dígito
if n == 0:
return 1
contador = 0
# Enquanto houver dígitos, vamos “removendo” o último com divisão inteira
while n > 0:
n = n // 10
contador += 1
return contador
while, sem conversão para str, trata
def conta_digitos(n):
# Desconsiderar o sinal
if n < 0:
n = -n
# Caso especial: zero tem 1 dígito
if n == 0:
return 1
contador = 0
# Enquanto houver dígitos, vamos “removendo” o último com divisão inteira
while n > 0:
n = n // 10
contador += 1
return contador
Resposta
def conta_digitos(n):
# Desconsiderar o sinal
if n < 0:
n = -n
# Caso especial: zero tem 1 dígito
if n == 0:
return 1
contador = 0
# Enquanto houver dígitos, vamos “removendo” o último com divisão inteira
while n > 0:
n = n // 10
contador += 1
return contador
# Desconsiderar o sinal
if n < 0:
n = -n
# Caso especial: zero tem 1 dígito
if n == 0:
return 1
contador = 0
# Enquanto houver dígitos, vamos “removendo” o último com divisão inteira
while n > 0:
n = n // 10
contador += 1
return contador