Anuncio

Colapsar
No hay ningún anuncio todavía.

Determinar si es numero perfecto.

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Python Determinar si es numero perfecto.

    Código:
    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:
    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.

    - - - Actualizado - - -

    Código:
    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))
    El anterior codigo hace la misma funcion que range pero para cualquier numero grande dado, pero ahora mi pregunta es, como puedo modificar el codigo de arriba para llamar la funcion lrange, y ponerle cualquier numero que yo quiera, es decir si quiero llamar a lrange(0,10) con num1=0,num2=10, que modifico? En otras palabras [FONT=verdana]lo que quiero es esto:[/FONT]

    [FONT=verdana]>>> import mirango[/FONT]
    [FONT=verdana]>>> mirango.lrange(num1,num2)[/FONT]

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

    - - - Actualizado - - -

    [FONT=Arial]Este es mi nuevo codigo:

    [/FONT]
    Código:
    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'
    [FONT=Arial]El cual importa el siguiente modulo, guardado con nombre generador.py):

    [/FONT]
    Código:
    def fn_generadora(inicial,final,paso):
        iterador=inicial
        while (iterador<final):
            yield iterador
            iterador=iterador+paso
    [FONT=Arial]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 (el cual lo toma y empieza a hacer los calculos pero falla al final) es Memory Error. Como arreglo esto?[/FONT]
    Última edición por lindtaylor; 20/11/2012, 01:41:33.
    asdadsdsassdadsasdadsadsads

  • #2
    Re: Determinar si es numero perfecto.

    En versiones anteriores a Python 3, para evitar problemas al llamar range, puedes usar xrange (toma los mismos parámetro), si usas Python 3 creo que no te debería dar ningún problema al usar range (pasa a comportarse como xrange) : http://avinashv.net/2008/05/pythons-range-and-xrange/. Así no tienes que crear tu propia función.

    Comentario

    Contenido relacionado

    Colapsar

    Trabajando...
    X