Ayuda para mejorar programa para números primos VB 2010 Express

Iniciado por juanlulete, 15 Julio 2012, 11:04 AM

0 Miembros y 1 Visitante están viendo este tema.

juanlulete

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.

Código (vbnet) [Seleccionar]
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

Yoghurt

#1
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):
Código (vbnet) [Seleccionar]

'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:
Código (vbnet) [Seleccionar]

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

juanlulete

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?

Yoghurt

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:
Código (vb) [Seleccionar]

' 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 ;)

juanlulete


Keyen Night

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Yoghurt

#6
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) ya comprobaste que arroja verdaderos numeros primos?

Encontré una pagina interesante: 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 sacada desde -> http://primes.utm.edu/primes/