Mensajes: 5
Temas: 3
Registro en: Oct 2017
Reputación:
0
Buenos días, soy nuevo en el foro, y tras realizar mi presentación, solicito ayuda sobre este tema:
Estoy intentando realizar un ejercicio en el que me piden los divisores de un número mayor que cero (salvo el mismo número y el 1). Más o menos lo tengo resuelto; pero necesito que me devuelva la lista de los divisores separados por comas y al final, tras el último divisor de la lista, que ponga un punto. Esto no soy capaz de conseguirlo. Aquí les dejo lo que he podido crear hasta ahora. Muchas gracias.
a = int(input('Escribe un número entero mayor que cero: '))
if a>0:
for i in range(2, a):
if a%i==0:
print(i,',',end='.')
if a%i!=0:
print('El número', a, 'es primo')
if a<=0:
print ('El número debe ser mayor que cero')
#Me falta que salga un punto despues del ultimo divisor. P. ej. con el 854
#Si pongo esto: print(i,',',end='.') sale esto: 2 ,.7 ,.14 ,.61 ,.122 ,.427 ,.
#Si pongo esto: print(i,sep=', ',end='.') sale esto: 2.7.14.61.122.427
#Necesito que salga 2, 7, 14, 61, 122, 427.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola, ¿cómo estás?
El problema radica en que tal vez la funcionalidad de los parámetros sep y end no es tan intuitiva. sep indica qué cadena debe utilizarse como separador cuando se quieren imprimir múltiples valores en una misma llamada a print().
Código: # Por defecto es un espacio.
>>> print(1, 2, 3, 4)
1 2 3 4
>>> print(1, 2, 3, 4, sep=", ")
1, 2, 3, 4
Por otro lado, end indica la cadena que se añadirá al final una vez imprimido el mensaje. Por defecto es "
" (el caracter de salto de línea), de modo que cada llamada a print() implica una línea nueva.
Lo que te propongo es que en lugar de ir imprimiendo por partes el mensaje, lo construyas previamente y lo imprimas al final como una cadena completa. El código sería más o menos así:
Código: a = int(input('Escribe un número entero mayor que cero: '))
divisors = []
if a > 0:
for i in range(2, a):
if a % i == 0:
divisors.append(str(i))
print(", ".join(divisors) + ".")
if a <= 0:
print('El número debe ser mayor que cero')
Lo que hacemos es ir almacenando los divisores que encontramos en una lista (previamente los convertimos a una cadena ya que luego deberemos unirlos todos). Al finalizar el bucle hacemos uso de la función str.join(), que conecta un conjunto de cadenas a partir de un separador determinado (en nuestro caso, una coma y un espacio). Por último añadimos el punto al final de la cadena con un simple signo de adición.
Te dejo un enlace a un artículo que escribí hace un tiempo sobre cómo determinar si un número es primo o no en Python: http://recursospython.com/guias-y-manual...os-primos/.
Saludos!
Mensajes: 5
Temas: 3
Registro en: Oct 2017
Reputación:
0
Muchas gracias Francisco. Visto así para super sencillo. y Además es una forma muy elegante de hacerlo.
Ahora encuentro otro problema, y es que el programa que me has resuelto funciona perfectamente, pero cuando intento hacer que cuando sea un numero primo me lo diga, o cuando introduzco el número 1, no me da salida, o me salen cosas raras. Tengo lo siguiente:
a = int(input('Escribe un número entero mayor que cero: '))
divisors = []
if a > 0:
for i in range(2, a):
if a % i == 0:
divisors.append(str(i))
print(", ".join(divisors) + ".")
else:
print('El número', a,'es primo')
iif a <= 0:
print('El número debe ser mayor que cero')
else:
print('El número', a,'es primo')
y esto es lo que me sale:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Escribe un número entero mayor que cero: 14
2, 7.
El número 14 es primo #Esto no debería salir
>>> ================================ RESTART ================================
>>>
Escribe un número entero mayor que cero: 13
. #Este punto no debería salir
El número 13 es primo
>>> ================================ RESTART ================================
>>>
Escribe un número entero mayor que cero: 1
. #Este punto no debería salir
El número 1 es primo
>>> ================================ RESTART ================================
>>>
Escribe un número entero mayor que cero: -1
El número -1 es primo #Esto no debería salir
El número debe ser mayor que cero
>>>
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
El problema es que deberías utilizar alguna función para determinar si el número ingresado es primo. Copiando el código del enlace que dejé anteriormente, sería más o menos así:
Código: #!/usr/bin/env python
# -*- coding: utf-8 -*-
def get_prime_numbers(max_number):
# Crear una lista que contiene el estado (tachado/no tachado)
# de cada número desde 2 hasta max_number.
numbers = [True, True] + [True] * (max_number-1)
# Se comienza por el 2. Esta variable siempre tiene un
# número primo.
last_prime_number = 2
# Esta variable contiene el número actual en la lista,
# que siempre es un múltiplo de last_prime_number.
i = last_prime_number
# Proceder siempre que el cuadrado de last_prime_number (es decir,
# el último número primo obtenido) sea menor o igual que max_number.
while last_prime_number**2 <= max_number:
# Tachar todos los múltiplos del último número primo obtenido.
i += last_prime_number
while i <= max_number:
numbers[i] = False
i += last_prime_number
# Obtener el número inmediatamente siguiente al último
# número primo obtenido (last_prime_number) que no esté tachado.
j = last_prime_number + 1
while j < max_number:
if numbers[j]:
last_prime_number = j
break
j += 1
i = last_prime_number
# Retornar todas los números de la lista que no están tachados.
return [i + 2 for i, not_crossed in enumerate(numbers[2:]) if not_crossed]
def is_prime(n):
return n in get_prime_numbers(n)
a = int(input('Escribe un número entero mayor que cero: '))
divisors = []
if a > 0:
if is_prime(a):
print('El número es primo.')
else:
for i in range(2, a):
if a % i == 0:
divisors.append(str(i))
print(", ".join(divisors) + ".")
else:
print('El número debe ser mayor que cero')
Saludos!
Mensajes: 5
Temas: 3
Registro en: Oct 2017
Reputación:
0
Ok, muchísimas gracias. Voy a ver si lo descifro; pero funciona perfectamente. Eres un criack.
|