Python - determinar si un numero es perfecto, error de sobrecarga

   
Vista:

determinar si un numero es perfecto, error de sobrecarga

Publicado por jhon mclaurin (12 intervenciones) el 19/11/2012 05:01:26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:

1
2
3
4
5
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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

determinar si un numero es perfecto, error de sobrecarga

Publicado por xve (1232 intervenciones) el 19/11/2012 08:07:00
Hola Jhon, tuve tu mismo problema hace un tiempo y buscando por internet, encontré un código que utilizando la misma semántica de range te devuelve el resultado sin limite de caracteres.

En el ejemplo, devuelve una lista con los valores...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
 
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 += step
 
print list(lrange(111111111111111111111111111, 111111111111111111111111121))


Espero que te sirva... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

determinar si un numero es perfecto, error de sobrecarga

Publicado por juan marquez (12 intervenciones) el 19/11/2012 20:01:10
Gracias, ese codigo si acepta cualquier intervalo, pero como lo puedo poner para que pueda invocar esa funcion con cualquier num1, num2? es decir, si quiero llamar a print list(lrange(num1, num2)
con num1, num2 ingresados por el usuario.?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

determinar si un numero es perfecto, error de sobrecarga

Publicado por xve (1232 intervenciones) el 19/11/2012 20:56:40
Hola Juan, podrías hacer algo así:

1
2
for i in list(lrange(n1,n2)):
    ....


Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

determinar si un numero es perfecto, error de sobrecarga

Publicado por juan marquez (12 intervenciones) el 19/11/2012 21:10:59
mmm, nose como, por ejemplo, estando en la terminal de python quiero llamar la funcion lrange que defini, y el programa lo guarde en un archivo llamado mirango.py, lo que quiero es esto

>>> import mirango
>>> mirango.lrange(0,10)

aca deberia darme la lista [0,1,2,3,4,5,6,7,8,9]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

determinar si un numero es perfecto, error de sobrecarga

Publicado por juan marquez (12 intervenciones) el 20/11/2012 01:36:52
Este es mi nuevo codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n=input('ingrese un numero ')
import generador
sumatorio=0
lista=[]
for i in list(generador.fn_generadora(1,n,1)):
	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 cual importa el siguiente modulo, guardado con nombre generador.py):

1
2
3
4
5
def fn_generadora(inicial,final,paso):
	iterador=inicial
	while (iterador<final):
		yield iterador
		iterador=iterador+paso


Ahora al ponerle un numero grande, digamos el numero 8 589 869 056 (el cual es perfecto) ya no me sale el error de overflow (asumo que se arreglo con el generador importado) pero ahora el error que sale al ponerle dicho numero es Memory Error. Como arreglo esto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

determinar si un numero es perfecto, error de sobrecarga

Publicado por xve (1232 intervenciones) el 20/11/2012 07:26:17
Hola Juan, ten en cuenta que todos los valores los pones en una lista, y esto dependiendo de la cantidad de números que sean, te va a consumir mucha memoria... no se cuenta memoria tienes en tu ordenador, ni cuanta memoria necesita, pero si ves que no hay solución, luego la otra opción que se me ocurres, seria que en vez de devolver una lista, la función fn_generadora, generara un archivo con todos los valores, para posteriormente leer linea a linea, aunque no se si también tendrás problemas de memoria...

Cuanta memoria RAM tiene tu ordenador?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

determinar si un numero es perfecto, error de sobrecarga

Publicado por j.marquez (12 intervenciones) el 26/11/2012 05:53:30
Tengo 2 gigas de ram.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar