Stack Overflow em Português Asked by Pedro Bernardo on August 7, 2020
Faça um programa que leia dois números inteiros, representando os valores inicio e fim de um intervalo e imprima os múltiplos de 5 entre eles.
Meu código:
valores = input().split()
numero1 = int(valores[0])
numero2 = int(valores[1])
for n in range(numero1, numero2+1):
if n % 5 == 0:
print(n, end='|')
Notem que os números são separados por |
, mas não pode ter esse caractere depois do último número.
Uma alternativa é usar join
:
print('|'.join(str(n) for n in range(numero1, numero2 + 1) if n % 5 == 0))
Apesar de parecer a mesma coisa da outra resposta, tem uma diferença. Lá foi criada uma lista contendo os números, depois esta lista foi passada para join
. Aqui eu passei diretamente a generator expression, que não cria a lista. Assim, o join
itera pelos números e já vai construindo a string final (não que vá ter aquela diferença de performance - ainda mais para ranges com poucos valores - mas é importante saber que você pode construir o que precisa sem criar listas - ou quaisquer outras estruturas - sem necessidade).
Mas na verdade existe outra forma de otimizar o código. Se a ideia é imprimir apenas os múltiplos de 5, não tem porque o range
ser de 1 em 1 e ir testando se cada número é divisível por 5 (já que entre 2 múltiplos, outros 4 números serão testados sem necessidade). Em vez disso, você pode simplesmente começar em um múltiplo de 5 e fazer o range
ir de 5 em 5:
numero1 = # ler o número
numero2 = # ler o número
# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
numero1 += 5 - resto
# range pula de 5 em 5
print('|'.join(map(str, range(numero1, numero2 + 1, 5))))
Dessa forma, eu só preciso testar se o primeiro número é divisível por 5. Se for, não precisa fazer nada. Se não for, eu ajusto para o próximo múltiplo (por exemplo, se for 7, ajusto para 10). Como agora eu sei que estou começando com um múltiplo de 5, o range
pode iterar de 5 em 5, e assim eu não preciso testar dentro do loop se os números são divisíveis por 5 (na verdade nem precisa mais do for
: eu posso passar o range
diretamente, pois agora ele só terá múltiplos de 5).
Uma alternativa ao join
é imprimir o range
diretamente:
numero1 = # ler o número
numero2 = # ler o número
# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
numero1 += 5 - resto
print(*range(numero1, numero2 + 1, 5), sep='|')
Note o asterisco antes do range
: ele serve para fazer o unpacking dos valores do range
(é como se eu passasse cada um deles separadamente para print
), e o parâmetro sep
indica o caractere que será impresso entre os elementos (é mais ou menos o que a outra resposta sugeriu, mas sem precisar criar a lista).
Outra alternativa é usar enumerate
, que itera pelos números e seus respectivos índices. Assim, você não imprime o caractere |
somente para o primeiro elemento:
numero1 = # ler o número
numero2 = # ler o número
# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
numero1 += 5 - resto
for i, n in enumerate(range(numero1, numero2 + 1, 5)):
if i > 0: # não é o primeiro número, coloca o separador
print('|', end='')
print(n, end='')
Ou não use o índice, simplesmente verifique se o número é igual ao primeiro:
numero1 = # ler o número
numero2 = # ler o número
# se não for múltiplo de 5, ajustar para o próximo múltiplo
resto = numero1 % 5
if resto != 0:
numero1 += 5 - resto
for n in range(numero1, numero2 + 1, 5):
if n != numero1: # não é o primeiro número, coloca o separador
print('|', end='')
print(n, end='')
Correct answer by hkotsubo on August 7, 2020
Sem considerar que você não está tratando o input, uma maneira fácil de juntar os números seria colocando todos eles em uma lista de strings e usar o método join()
para imprimir o resultado.
Esse método é esperto o suficiente para fazer exatamente o que você quer, ou seja, só colocar o separador entre os elementos.
O código do laço for
e da condição if
fica todo em uma compreensão de lista. Cada elemento é convertido para o tipo str
, para que o join()
funcione.
Ficaria assim:
valores = input().split()
numero1 = int(valores[0])
numero2 = int(valores[1])
lista = [str(n) for n in range(numero1, numero2+1) if n % 5 == 0]
print('|'.join(lista))
Answered by Guilherme Brügger on August 7, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP