Autor Tema: Determinar si es número perfecto.

0 Usuarios y 1 Visitante están viendo este tema.

19 Noviembre, 2012, 04:57 am
Leído 7275 veces

lindtaylor

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,371
  • País: cl
  • Karma: +0/-2
  • Sexo: Masculino
Código: [Seleccionar]
n=input('ingrese un numero ')


sumatorio=0
lista=[]
for i in range(1,n):
    if n%i==0:
        sumatorio=sumatorio+i
        lista.append(i)


           
   
if sumatorio==n:
    print n,'es un numero perfecto y sus divisores propios son los numeros que estan en la siguiente lista: ',lista


else:
    print 'no es perfecto'
El anterior codigo verifica si un numero es perfecto y entrega una lista con sus divisores propios. Mi duda es que no le puedo ingresar un numero muy grande ya que python me da error de sobrecarga, este es el mensaje al ponerle un numero grande:

Código: [Seleccionar]
ingrese un numero 9999999999999999999
Traceback (most recent call last):
  File "perfecto.py", line 2, in <module>
    for j in xrange(1,n):
OverflowError: long int too large to convert to int

que modificacion (sencilla ojala, ya que he visto en la web que lo arreglan haciendo una clase para range etc) puedo hacerle a mi programa para que lea cualquier numero entero grande? Desde ya gracias.


numero perfecto    número perfecto
....

19 Noviembre, 2012, 05:24 am
Respuesta #1

Phicar

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 513
  • Karma: +1/-0
  • Sexo: Masculino
    • redinfocol.org
Hola, yo de python no sé..pero es que creo que range crea de una vez el set de números, y pues eso requeriría muchísima memoria.
Así el programa te deje crearlo, con ese número no te terminará en un buennn(me refiero muchísimo) tiempo...te recomiendo que veas la forma de euclides para números perfectos.
redinfocol.org

19 Noviembre, 2012, 06:16 am
Respuesta #2

lindtaylor

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,371
  • País: cl
  • Karma: +0/-2
  • Sexo: Masculino
y no hay una forma de solucionar el overflow? ya que también me sale ese error en otros programas similares
....

19 Noviembre, 2012, 03:03 pm
Respuesta #3

Phicar

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 513
  • Karma: +1/-0
  • Sexo: Masculino
    • redinfocol.org
Pues sí lo puedes hacer, pero lo que te digo, esa vaina no te va a terminar nunca(pues sí pero después de mucho tiempo).
En java puedes usar java.math.BigInteger o en C puedes buscar librerias que te permitan manejar números grandes(hay varias).
redinfocol.org

19 Noviembre, 2012, 09:26 pm
Respuesta #4

lindtaylor

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,371
  • País: cl
  • Karma: +0/-2
  • Sexo: Masculino
Me dieron el siguiente codigo que funciona igual que range pero para cualquier intervalo.

Código: [Seleccionar]
import operator
def lrange(num1,num2=None,step=1):


op=operator.__lt__
if num2 is None:
num1,num2=0,num1

if num2<num1:
if step>0:
num1=num2
op=operator.__gt__

elif step<0:
num1=num2

while op(num1,num2):
yield num1
num1=num1+step


print list(lrange(1111111111111111111111111111111,11111111111111111111111111111))

Dicho código me entrega una lista desde el número 1111111111111111111111111111111 al número 11111111111111111111111111111.

Pero me falta el detalle de que estando en la terminal de python, quiero llamar la funcion lrange que definí dado cualquier valor de num1 y num2 ingresador por el usuario en la función,  el programa lo guarde en un archivo llamado mirango.py, lo que quiero es esto:

>>> import mirango
>>> mirango.lrange(num1,num2)

aca debería darme la lista desde num1 a num2-1, es decir,  [num1,...,num2-1]. Qúe le modifico al código?
....