Programación General > Visual Basic para principiantes

 Numeros perfecto

(1/2) > >>

fraj:
Ak de nuevo  con otro problemita
numeros perfectos  :me corre muy biem el programa lo malo q  solo me admite los 5 primeros numeros perfectos
osea :6, 28, 496, 8128, 33550336 Y no 8589869056 sale depurar

--- Código: Visual Basic ---Private Sub Cmdcalcular_Click()Dim numero As Long, sumas As Double, i As Long numero = Val(Txtnu.Text)sumas = 0For i = 1 To numero - 1    If numero Mod i = 0 Then sumas = sumas + iNextIf sumas = numero Then    Lblres.Caption = Str(numero) + " es un numero perfecto"Else       Lblres.Caption = Str(numero) + " no es un numero perfecto"   End IfEnd Sub   Q opcion me dan ustedes , o si seria mejor plantearlo de otra forma  :(
muchas gracias por su ayudaa  :)

Nebire:
Bueno, esto ya no es un problema de VB, esto es claramente un problema matemático, es decir un algoritmo... un problema independiente del lenguaje...

Lo que te falta es comprobar que el número que se ofrece como solución debe ser primo para que sea un número perfecto... to te propongo este sencillo algoritmo:


--- Código: Visual Basic --- Private Sub Command1_Click()    Call NumPerfecto(10)End Sub Public Function NumPerfecto(ByVal m As Long)   Dim k As Long, n As Double   For k = 2 To m        n = (2 ^ k) - 1        If EsPrimo(n) Then            ' entonces lo siguiente es numero perfecto            n = (2 ^ (k - 1)) * n            Print n;        End If   NextEnd Function Private Function EsPrimo(ByVal n As Double) As Boolean    ' calcula o mejor comparalo con una tabla.... de primos    If n...... Then ' si n aparece en una tabla de primos entonces es primo        EsPrimo = True    End ifEnd Function  
Como verás sólo te falta añadir la comprobación de la condición de primo. lo más efectivo es usar una tabla de primos (calcular cada número es bastante lento), además para hacerlo más óptimo, puesto que en cada iteración el número a buscar es más grande, a la función es primo debería añadírsele un parámetro para que en base a él guardara el último lo calizado en la tabla y comenzar desde él o bien resetaearlo y empezar de nuevo.. te ilustro esa idea... (verás que la función esprimo2 ahora está completa, sólo falta la tabla que deberías cargar al inicio... si necesitas una tabla de primos, puedes probar a buscarla por internet, de todas formas creo recordar que tengo guardado en algún duisco duro tablas de hasta el primer millón de primos y otros archivos más pequeños...


--- Código: Visual Basic --- Public Function NumPerfecto2(ByVal m As Long)   Dim k As Long, n As Double, v as double       me.autoredraw=true    me.cls   Call EsPrimo2(1, True)  ' aquí reseteamos sin afectar en nada al resto, es decir hacemos que el static de esprimo2 'k' tome el valor 1   For k = 2 To m        v = (2 ^ k) - 1        If EsPrimo2(n) Then            ' entonces lo siguiente es numero perfecto            n = (2 ^ (k - 1)) * v            Print k, v, "=", n:        End If   NextEnd Function Private Function EsPrimo2(ByVal n As Double, Optional Resetear As Boolean) As Boolean    Static k As Long ' eneavo nº consultado en la tabla       If Resetear = True Then k = 1        ' compara con una matriz de primos cargada al inicio    Do While tablaprimos(k) <= n        If n = tablaprimos(k) Then            EsPrimo2 = True            Exit Do        End if        k = k + 1    LoopEnd Function  En realidad dado que que pronto se alcanzan cifras muy grandes de n, incluso recorrer la tabla de primos continuando desde donde se quedó la última vez puede llegar a ser lento (depende de cuantos números quieras calcular, claro), y en dicho caso deberías modificar el algoritmo para hacer una detección más óptima ( por ejemplo utilizando marcadores sobre la tabla), pero de lo que trata el problema es de encontrar una solución y eso es lo que se hace... el resto queda a tu esfuerzo.

Si algo no lo entiendes, ya sabes, pregunta...

fraj:
:D  muchas gracias , x los ejerccios  :D  :D

Jimbenit:
La funcion:
EsPrimo:


--- Código: Visual Basic ---    Private Function EsPrimo(ByVal n As Long) As Boolean        Dim i As Integer        Dim Contador As Integer : Contador = 0         'En caso de que el numero sea 1, indicara que es primo        If n = 1 Then            EsPrimo = True            Exit Function        End If         'Contador cuenta el numero de submultiplos, desde el 1 hasta la mitad del numero        For i = 1 To Int(n / 2)            If (n Mod i) = 0 Then                Contador = Contador + i            End If        Next i         If Contador = 1 Then            EsPrimo = True        Else            EsPrimo = False        End If       End Function 
 :P

Jimbenit:
Coloca un boton llamado command1
y pega este code:

--- Código: Visual Basic ---Private Function EsPrimo(ByVal n As Long) As Boolean        Dim i As Integer        Dim Contador As Integer: Contador = 0         'En caso de que el numero sea 1, indicara que es primo        If n = 1 Then            EsPrimo = True            Exit Function        End If         'Contador cuenta el numero de submultiplos, desde el 1 hasta la mitad del numero        For i = 1 To Int(n / 2)            If (n Mod i) = 0 Then                Contador = Contador + i            End If        Next i         If Contador = 1 Then            EsPrimo = True        Else            EsPrimo = False        End If      End Function     Private Function Nro_Primos(ByRef Vector() As Long, ByVal Lim_Sup As Integer) As String        'Esta funcion devuelve una cadena de numeros primos colocados en columna.        Dim i As Integer        ReDim Vector(1)        Dim Contador As Integer: Contador = 0        Dim Texto As String: Texto = ""         For i = 1 To Lim_Sup             If EsPrimo(i) Then                ReDim Preserve Vector(i)                Contador = Contador + 1                Vector(Contador) = i                Texto = Texto & i & vbCrLf            End If         Next i         Nro_Primos = Texto     End Function Private Sub Command1_Click()Dim Vect() As Long MsgBox (Nro_Primos(Vect, 100)) End Sub 
Te aparece la lista de numeros primos... :lol:  :lol:  :lol:  :lol:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa