- O número 135 satisfaz a propriedade
. As potências (em vermelho) na soma correspondem à posição do respectivo algarismo no número 135 (ex.: o 5 é o terceiro algarismo no número 135). Encontre todos os números menores do que 1000 que satisfazem a mesma propriedade, usando print() para mostrar cada número. A definição de sua rotina deve ser:
def numeros():
- Implemente uma solução usando for
- Implemente uma solução usando while
def numeros():
Passo 1
O enunciado pede para encontrar todos os números menores do que
que satisfazem a propriedade: o número é igual à soma de cada algarismo elevado à potência da sua posição no número (a posição conta a partir de 1 no algarismo mais à esquerda). Foi dado o exemplo
porque
O exercício exige que você implemente uma rotina chamada
def numeros(): e que dentro dela haja:- uma solução usando
forque imprime (comprint()) cada número encontrado, - uma solução usando
whileque também imprime (comprint()) cada número encontrado.
Não há outras restrições explícitas (por exemplo, se inclui o— neste contexto vamos considerar os inteiros não-negativos menores que , mas veremos que os números óbvios aparecem).
Passo 2
Entendendo bem a propriedade e como computá-la passo a passo:
- Seja um número
com algarismos. Podemos escrever seus algarismos, da esquerda para a direita, como . - A condição que queremos testar é
Aqui
é o
-ésimo algarismo (esquerda para direita) e
é a posição (começando em
).
- Duas formas práticas de obter os algarismos e suas posições:
- Converter o número para string e iterar sobre os caracteres: fácil e direto, permitindo usar o índice (posição) naturalmente.
- Usar operações aritméticas (divisão inteira e resto) para extrair dígitos — mais “matemática”, porém precisa tomar cuidado para obter a ordem correta (esquerda para direita) ou inverter a ordem quando extraído de direita para esquerda.
Vou usar a forma por string porque é mais limpa e evita erros de ordem das posições; depois mostro a versão com
while fazendo a mesma ideia também usando string (poderíamos usar aritmética, mas string é suficiente e segura na prova).Passo 3
Vamos provar a ideia com o exemplo
para deixar claro como computar a soma:
- Converter
em string: "135". Os caracteres são'1','3','5'. - Converter cada caractere para inteiro:
, , . - Calcular
.
Isto mostra que o procedimento de iterar sobre os dígitos em ordem e elevar ao índice (posição) dá o resultado desejado.
Passo 4
Implementação usando
for (explicação linha a linha):- Percorremos todos os inteiros
de até (ou de a se quisermos ignorar o ; incluiremos sem prejuízo). - Para cada
transformamos em string: s = str(n). - Criamos uma variável
soma = 0. - Iteramos sobre os índices e caracteres da string com
for i, ch in enumerate(s, start=1):ié a posição(começando em ), ché o caractere do dígito que transformamos em inteiro comint(ch)para obter.
- Atualizamos
soma += int(ch) ** i. - Após o laço, testamos
if soma == n:e entãoprint(n).
Exemplo de código (versão com
for):def numeros():
# solução com for
for n in range(1000): # n vai de 0 a 999
s = str(n)
soma = 0
for i, ch in enumerate(s, start=1):
soma += int(ch) ** i
if soma == n:
print(n)
# a seguir vem a versão com while...
Explicação adicional: usamos conforme exigido pela definição do problema.
enumerate(..., start=1) para obter posições começando em
Passo 5
Por que todos os algarismos de um só dígito funcionam? Seja
um dígito entre
e
. Para
(número com um algarismo), a soma pedida é
. Assim qualquer número de um dígito satisfaz a propriedade trivially. É por isso que
aparecem entre as soluções (e
também, caso seja considerado).
Passo 6
Implementação usando
while (explicação linha a linha):- Vamos fazer a mesma lógica, mas usando
whilepara percorrer. - Inicializamos
n = 0. - Enquanto
n < 1000, fazemos:s = str(n)e calculamossomada mesma forma.- Se
soma == n,print(n). - Incrementamos
n += 1.
- Isso é equivalente ao
foracima, só que usandowhile.
Exemplo de código (completando a definição
numeros()):def numeros():
# solução com for
for n in range(1000):
s = str(n)
soma = 0
for i, ch in enumerate(s, start=1):
soma += int(ch) ** i
if soma == n:
print(n)
# solução com while
n = 0
while n < 1000:
s = str(n)
soma = 0
i = 1
for ch in s:
soma += int(ch) ** i
i += 1
if soma == n:
print(n)
n += 1
Observação didática: na versão
while acima eu optei por iterar os caracteres com um for interno apenas para demonstrar como manter a posição i manualmente; poderíamos também usar enumerate dentro do while. O importante é que um dos laços externos seja while.Passo 7
Complexidade e observações práticas:
- Estamos testando
números; para cada número fazemos um pequeno laço sobre seus a dígitos. O custo é muito baixo e executável instantaneamente. - Em prova, essa abordagem por conversão para string e iteração por índices é segura, legível e simples de implementar sem cálculo pesado.
- Sempre verifique a indexação (começar em
) — erro comum é começar em e obter potências erradas.
Passo 8
Executando mentalmente (ou com o código), os números menores que
que satisfazem a propriedade são todos os números de um dígito e alguns números de múltiplos dígitos. O conjunto completo (ordenado) é:
.
Resposta
1
2
3
4
5
6
7
8
9
89
135
175
518
598
2
3
4
5
6
7
8
9
89
135
175
518
598