Hola os quería pedir ayuda para un programa de números primos.
Estoy haciendo un programa que comprueba si un número es primo o no y he intentado hacerlo lo mejor posible para que funcione mas rápido.
Al código también le añadí una formula que sirve para que si el número es divisible por 3 excepto el tres ya me diga que no es primo y se ahorre tener que hacer lo demás.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not IsNumeric(TextBox1.Text) Then Exit Sub
Dim i As Integer
Dim Total As Integer
For i = 1 To Len(TextBox1.Text)
Total = Total + Val(Mid(TextBox1.Text, i, 1))
Next
If TextBox1.Text = 3 Then
Label1.Text = ("El número es Primo")
Else
If Total Mod 3 = 0 Or TextBox1.Text = 1 Then
Label1.Text = ("El número no es Primo")
Else
Dim resultado As Integer = -1
Dim n As Double = TextBox1.Text
For i = 2 To Math.Sqrt(n)
If n Mod i = 0 Then
resultado = 0
Exit For
End If
Next
If resultado = 0 Then Label1.Text = ("El número no es Primo")
If resultado = -1 Then Label1.Text = ("El número es Primo")
End If
End If
End Sub
End Class
El programa va muy bien ya que utiliza el método de la raíz cuadrada.
Bueno pues lo que quiero hacer es modificar este código para que en vez de comprobar si un número es primo o no te haga una lista en un listbox de todos los números primos desde un mínimo (textbox(min)) hasta un máximo (textbox(max)) pero sin cambiar el método.
Y también quería ver si hay alguna función para que coja el último dígito o la ultima letra de un textbox y como se utiliza.
Gracias de antemano
Hola! bueno, comienzo por decirte que tu algoritmo es solo la primera funcion de una funcion maestra en la que comprueba de forma matemática si es verdaderamente un numero primo.
Bueno, he chekado los links (en orden) pues no sabia demasiado de los numeros primos.
¿Que es un numero Primo?
> http://es.wikipedia.org/wiki/N%C3%BAmero_primo
AKS "PRIMES in P" algoritmo (el mejor y mas reciente algoritmo)
> http://fatphil.org/maths/AKS/
Implementación AKS (en C++)
> http://yves.gallot.pagesperso-orange.fr/src/aks.html
En la implementación notarás de lo que hablo, es mucho más largo el proceso aunque para numero pequeños estará bien.
Este trozo de código lo he pescado desde la implemetación y lo he traducido a Visual Basic 6 (no se como quedaria en Visual Basic 2010):
'Esto lo he hecho para testear la funcion.
Private Sub Form_Load()
Dim j As Integer
For j = 0 To 100
if isPrime(j) Then
Debug.Print j & ", "
End If
Next j
End Sub
Function isPrime(ByVal iNum As Integer) As Boolean
If (iNum < 2) Then isPrime = False: Exit Function
If (iNum < 4) Then isPrime = True: Exit Function
If (iNum Mod 2 = 0) Then isPrime = False: Exit Function
Dim iMax As Integer: iMax = CInt(Sqr(CDbl(iNum)))
Dim i As Integer
For i = 3 To iMax Step 2
If (iNum Mod i = 0) Then isPrime = False: Exit Function
Next i
isPrime = True
End Function
umm.. integrando la funcion isPrime() yo pondría tu código de esta forma:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If isPrime(Val(TextBox1.Text)) Then
Label1.Text = ("El número es Primo")
Else
Label1.Text = ("El número no es Primo")
End If
End Sub
Private Function isPrime(ByVal iNum As Integer) As Boolean
' Versión traducida de la antes mensionada
' función isPrime para Visual Basic Express 2010
End Function
End Class
AbrahamAraon está muy bien el código que me has dado, funciona muy bien (No se si mejor o peor) pero lo que no consigo hacer es cambiar mi código para que me genere números primos en un listbox con dos textbox un número de inicio para generar números primos y un límite y el botón para ejecutarlo.
¿Me podrían ayudar a cambiarlo?
Y otra cosa en mi código cuando lo ejecuto solo me proporciona la respuesta a números menores de 10 dígitos. Si son 10 o más me da error y se para.
¿Cómo puedo solucionarlo?
Para resolver problemas usa mi codigo que es una funcion basada en AKS del codigo C++ "isPrime()" la he probado con numeros del 0 - 100 y no dio error. (el codigo que tu hiciste fue un intento de la implementacion AKS solo que diferente :) )
Basicamente la funcion "isPrime()" lo que hace es ver si un numero es divisible por algún numero, y si no es divisible entonces es Primo. Por este motivo solo debes usarla para numeros pequeños pues puede dar "falsos positivos". La forma eficaz de saberlo es usando la implementacion completa de AKS.
Para lo que tu quieres hacer con pequeñas modificaciones se hace:
' Agrega en un proyecto standart, 2 TextBoxes, 1 ListBox y 1 Button.
' Codigo del Form:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim j As Integer
Dim iStart As Integer
Dim iLimit As Integer
iStart = Val(Text1.text) 'Extrae el valor del TextBox de inicio en el formulario
iLimit = Val(Text2.text) 'Extrae el valor del TextBox de limite en el formulario
For j = iStart To iLimit
if isPrime(j) Then
List1.Add j 'Agrega los numeros primos encontrados al ListBox en el formulario
End If
Next j
End Sub
Function isPrime(ByVal iNum As Integer) As Boolean
If (iNum < 2) Then isPrime = False: Exit Function
If (iNum < 4) Then isPrime = True: Exit Function
If (iNum Mod 2 = 0) Then isPrime = False: Exit Function
Dim iMax As Integer: iMax = CInt(Sqr(CDbl(iNum)))
Dim i As Integer
For i = 3 To iMax Step 2
If (iNum Mod i = 0) Then isPrime = False: Exit Function
Next i
isPrime = True
End Function
End Class
Espero te sirva :)
P.D.: Busca en la web una lista de numeros primos y testea tu codigo ;)
Está genial tu código muchas gracias AbrahamAraon :)
Mi firma tiene un tema interesante...
Cita de: Keyen Night en 16 Julio 2012, 21:48 PM
Mi firma tiene un tema interesante...
Interesante +1
Solo que no manejo .NET :-\ y no podria comprobarlo. estuve mirandolo y al parecer tu codigo es basado en alguna criba mesclada con algunas propiedades de los numeros primos (Wikipedia -> http://es.wikipedia.org/wiki/Número_primo (http://es.wikipedia.org/wiki/N%C3%BAmero_primo)) ya comprobaste que arroja verdaderos numeros primos?
Encontré una pagina interesante: http://mste.illinois.edu/html.f/resource/prime.html (http://mste.illinois.edu/html.f/resource/prime.html)
Y... una lista de numeros primos bastante larga -> http://primes.utm.edu/primes/lists/all.txt (http://primes.utm.edu/primes/lists/all.txt) sacada desde -> http://primes.utm.edu/primes/ (http://primes.utm.edu/primes/)