Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
resultado separado por comas y al final un punto
#1
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.
Responder
#2
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().

  1. # Por defecto es un espacio.
  2. >>> print(1, 2, 3, 4)
  3. 1 2 3 4
  4. >>> print(1, 2, 3, 4, sep=", ")
  5. 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 "\n" (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í:

  1. a = int(input('Escribe un número entero mayor que cero: '))
  2. divisors = []
  3.  
  4. if a > 0:
  5.    for i in range(2, a):
  6.        
  7.        if a % i == 0:
  8.            divisors.append(str(i))
  9.    
  10.    print(", ".join(divisors) + ".")
  11.            
  12. if a <= 0:
  13.    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!
Responder
#3
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
>>>
Responder
#4
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í:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. def get_prime_numbers(max_number):
  5. # Crear una lista que contiene el estado (tachado/no tachado)
  6. # de cada número desde 2 hasta max_number.
  7. numbers = [True, True] + [True] * (max_number-1)
  8. # Se comienza por el 2. Esta variable siempre tiene un
  9. # número primo.
  10. last_prime_number = 2
  11. # Esta variable contiene el número actual en la lista,
  12. # que siempre es un múltiplo de last_prime_number.
  13. i = last_prime_number
  14.  
  15. # Proceder siempre que el cuadrado de last_prime_number (es decir,
  16. # el último número primo obtenido) sea menor o igual que max_number.
  17. while last_prime_number**2 <= max_number:
  18. # Tachar todos los múltiplos del último número primo obtenido.
  19. i += last_prime_number
  20. while i <= max_number:
  21. numbers[i] = False
  22. i += last_prime_number
  23. # Obtener el número inmediatamente siguiente al último
  24. # número primo obtenido (last_prime_number) que no esté tachado.
  25. j = last_prime_number + 1
  26. while j < max_number:
  27. if numbers[j]:
  28. last_prime_number = j
  29. break
  30. j += 1
  31. i = last_prime_number
  32.  
  33. # Retornar todas los números de la lista que no están tachados.
  34. return [i + 2 for i, not_crossed in enumerate(numbers[2:]) if not_crossed]
  35.  
  36.  
  37. def is_prime(n):
  38. return n in get_prime_numbers(n)
  39.  
  40.  
  41. a = int(input('Escribe un número entero mayor que cero: '))
  42. divisors = []
  43.  
  44. if a > 0:
  45. if is_prime(a):
  46. print('El número es primo.')
  47. else:
  48. for i in range(2, a):
  49. if a % i == 0:
  50. divisors.append(str(i))
  51.  
  52. print(", ".join(divisors) + ".")
  53. else:
  54. print('El número debe ser mayor que cero')


Saludos!
Responder
#5
Ok, muchísimas gracias. Voy a ver si lo descifro; pero funciona perfectamente. Eres un criack.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)