elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Ayuda para mejorar programa para números primos VB 2010 Express
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda para mejorar programa para números primos VB 2010 Express  (Leído 6,902 veces)
juanlulete

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Ayuda para mejorar programa para números primos VB 2010 Express
« en: 15 Julio 2012, 11:04 »

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
  1. Public Class Form1
  2.  
  3.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.        If Not IsNumeric(TextBox1.Text) Then Exit Sub
  5.  
  6.        Dim i As Integer
  7.        Dim Total As Integer
  8.  
  9.        For i = 1 To Len(TextBox1.Text)
  10.            Total = Total + Val(Mid(TextBox1.Text, i, 1))
  11.        Next
  12.  
  13.        If TextBox1.Text = 3 Then
  14.            Label1.Text = ("El número es Primo")
  15.        Else
  16.            If Total Mod 3 = 0 Or TextBox1.Text = 1 Then
  17.                Label1.Text = ("El número no es Primo")
  18.  
  19.            Else
  20.                Dim resultado As Integer = -1
  21.                Dim n As Double = TextBox1.Text
  22.  
  23.                For i = 2 To Math.Sqrt(n)
  24.                    If n Mod i = 0 Then
  25.                        resultado = 0
  26.                        Exit For
  27.                    End If
  28.                Next
  29.                If resultado = 0 Then Label1.Text = ("El número no es Primo")
  30.                If resultado = -1 Then Label1.Text = ("El número es Primo")
  31.            End If
  32.        End If
  33.    End Sub
  34. End Class
  35.  

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


« Última modificación: 15 Julio 2012, 16:30 por raul338 » En línea

Yoghurt

Desconectado Desconectado

Mensajes: 122


Si alguien se molesto en escribir, justo es leer.


Ver Perfil WWW
Re: Ayuda para mejorar programa para números primos VB 2010 Express
« Respuesta #1 en: 15 Julio 2012, 13:36 »

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
  1. 'Esto lo he hecho para testear la funcion.
  2. Private Sub Form_Load()
  3.    Dim j  As Integer
  4.    For j = 0 To 100
  5.        if isPrime(j)  Then
  6.            Debug.Print j & ", "
  7.        End If
  8.    Next j
  9. End Sub
  10.  
  11. Function isPrime(ByVal iNum As Integer) As Boolean
  12.    If (iNum < 2) Then isPrime = False: Exit Function
  13.    If (iNum < 4) Then isPrime = True: Exit Function
  14.    If (iNum Mod 2 = 0) Then isPrime = False: Exit Function
  15.  
  16.    Dim iMax As Integer: iMax = CInt(Sqr(CDbl(iNum)))
  17.    Dim i    As Integer
  18.  
  19.    For i = 3 To iMax Step 2
  20.        If (iNum Mod i = 0) Then isPrime = False: Exit Function
  21.    Next i
  22.  
  23.     isPrime = True
  24. End Function
  25.  

umm.. integrando la funcion isPrime() yo pondría tu código de esta forma:
Código
  1. Public Class Form1
  2.  
  3.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.        If isPrime(Val(TextBox1.Text)) Then
  5.            Label1.Text = ("El n&#250;mero es Primo")
  6.        Else
  7.            Label1.Text = ("El n&#250;mero no es Primo")
  8.        End If
  9.    End Sub
  10.  
  11.    Private Function isPrime(ByVal iNum As Integer) As Boolean
  12.        ' Versi&#243;n traducida de la antes mensionada
  13.        ' funci&#243;n isPrime para Visual Basic Express 2010
  14.    End Function
  15. End Class
  16.  


« Última modificación: 15 Julio 2012, 16:31 por raul338 » En línea

juanlulete

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Ayuda para mejorar programa para números primos VB 2010 Express
« Respuesta #2 en: 15 Julio 2012, 17:10 »

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?
En línea

Yoghurt

Desconectado Desconectado

Mensajes: 122


Si alguien se molesto en escribir, justo es leer.


Ver Perfil WWW
Re: Ayuda para mejorar programa para números primos VB 2010 Express
« Respuesta #3 en: 16 Julio 2012, 02:04 »

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
  1. ' Agrega en un proyecto standart, 2 TextBoxes, 1 ListBox y 1 Button.
  2. ' Codigo del Form:
  3. Public Class Form1
  4.  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  5.      Dim j  As Integer
  6.      Dim iStart As Integer
  7.      Dim iLimit As Integer
  8.  
  9.      iStart = Val(Text1.text) 'Extrae el valor del TextBox de inicio en el formulario
  10.      iLimit = Val(Text2.text) 'Extrae el valor del TextBox de limite en el formulario
  11.  
  12.      For j = iStart To iLimit
  13.          if isPrime(j)  Then
  14.              List1.Add j 'Agrega los numeros primos encontrados al ListBox en el formulario
  15.          End If
  16.      Next j
  17.  End Sub
  18.  
  19.  Function isPrime(ByVal iNum As Integer) As Boolean
  20.      If (iNum < 2) Then isPrime = False: Exit Function
  21.      If (iNum < 4) Then isPrime = True: Exit Function
  22.      If (iNum Mod 2 = 0) Then isPrime = False: Exit Function
  23.  
  24.      Dim iMax As Integer: iMax = CInt(Sqr(CDbl(iNum)))
  25.      Dim i    As Integer
  26.  
  27.      For i = 3 To iMax Step 2
  28.          If (iNum Mod i = 0) Then isPrime = False: Exit Function
  29.      Next i
  30.  
  31.      isPrime = True
  32.  End Function
  33. End Class
  34.  

Espero te sirva :)

P.D.: Busca en la web una lista de numeros primos y testea tu codigo ;)
En línea

juanlulete

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Ayuda para mejorar programa para números primos VB 2010 Express
« Respuesta #4 en: 16 Julio 2012, 13:41 »

Está genial tu código muchas gracias AbrahamAraon :)
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Ayuda para mejorar programa para números primos VB 2010 Express
« Respuesta #5 en: 16 Julio 2012, 21:48 »

Mi firma tiene un tema interesante...
En línea

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

Desconectado Desconectado

Mensajes: 122


Si alguien se molesto en escribir, justo es leer.


Ver Perfil WWW
Re: Ayuda para mejorar programa para números primos VB 2010 Express
« Respuesta #6 en: 17 Julio 2012, 07:59 »

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/
« Última modificación: 17 Julio 2012, 08:09 por AbrahamAraon » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines