Programación General > Visual Basic para principiantes
Numeros perfecto
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
[#] Página Siguiente
Ir a la versión completa