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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo  (Leído 17,431 veces)
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
[SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« en: 7 Julio 2010, 12:31 pm »

Bueno, me hacia falta hacer una funcion de este tipo para un trabajito que estoy haciendo :silbar:... y he pensado que tal vez os seria util...
Código
  1. Public Function IsItPrime(ByVal lNumber As Long) As Boolean
  2.    Dim i       As Long
  3.  
  4.    If (lNumber > 2) And (lNumber Mod 2) Or (lNumber = 2) Then
  5.        For i = 2 To (lNumber ^ 0.5)
  6.            If (lNumber Mod i) = 0 Then
  7.                GoTo Exit_
  8.            End If
  9.        Next i
  10.        IsItPrime = True
  11.    End If
  12. Exit_:
  13. End Function

Podriamos hacer un jueguecito... a ver quien lo hace mas rapido/corto :D Os apuntais?

MOD: Yo utilizo este codigo para comprobar lo optimizado que esta:
Código:
Option Explicit

Private n       As Long

Private Sub Form_Load()
    Dim x       As Long
    
    Timer1.Interval = 10
    Timer1.Enabled = True
    For x = 0 To 10 ^ 6
        Call IsItPrime(x)
        DoEvents
    Next x
    Timer1.Enabled = False
    MsgBox n * 10 & " ms"
End Sub

Public Function IsItPrime(ByVal lNumber As Long) As Boolean
    Dim i       As Long
    
    If (lNumber > 2) And (lNumber Mod 2) Or (lNumber = 2) Then
        For i = 2 To (lNumber ^ 0.5)
            If (lNumber Mod i) = 0 Then
                GoTo Exit_
            End If
        Next i
        IsItPrime = True
    End If
Exit_:
End Function

Private Sub Timer1_Timer()
    n = n + 1
End Sub


« Última modificación: 7 Julio 2010, 13:04 pm por Karcrack » En línea

cbug

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #1 en: 7 Julio 2010, 12:45 pm »

Código:
If (lNumber > 2) And (lNumber Mod 2) Then

Al 2 lo evalúas?

Ahora en visual basic se puede modificar el long para que únicamente tome los enteros positivos?


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #2 en: 7 Julio 2010, 12:54 pm »

Código:
If (lNumber > 2) And (lNumber Mod 2) Then

Al 2 lo evalúas?

Ahora en visual basic se puede modificar el long para que únicamente tome los enteros positivos?
Cierto, habia olvidado que el 2 tambien es primo :laugh: ;) (Ahora lo corrijo Correjido ;))

Se puede utilizar un Integer, aunque tambien acepta Negativos... Pero solo enteros :-\
« Última modificación: 7 Julio 2010, 12:58 pm por Karcrack » En línea

cbug

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #3 en: 7 Julio 2010, 12:58 pm »

Citar
Se puede utilizar un Integer, aunque tambien acepta Negativos... Pero solo enteros

 :-\ Claro, porque de acuerdo a la definición, los números primos son aquellos números naturales que...

Pero igual, tu código creo que es el más eficiente en cuanto a complejidad, no sé cómo se tratará el goto en vb realmente... sin embargo, creo que se parece mucho al de la criba de eratóstenes...

Saludos!
En línea

Dreamaker

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #4 en: 7 Julio 2010, 13:00 pm »

Me quedó una duda, en el primer for lo haces hasta la raíz cuadrada del número para que sea más eficiente cierto? (Osea, tarde menos tiempo)

Está bien aunque es sencillo, y no comprueba si el 1 es primo o no (no digas nada) :xD
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #5 en: 7 Julio 2010, 13:02 pm »

Citar
Se puede utilizar un Integer, aunque tambien acepta Negativos... Pero solo enteros

 :-\ Claro, porque de acuerdo a la definición, los números primos son aquellos números naturales que...

Pero igual, tu código creo que es el más eficiente en cuanto a complejidad, no sé cómo se tratará el goto en vb realmente... sin embargo, creo que se parece mucho al de la criba de eratóstenes...

Saludos!
He pensado en usar la criba de Eratostenes pero es mas para generar una lista de primos, solo quiero comprobar si un número lo es :D

Me quedó una duda, en el primer for lo haces hasta la raíz cuadrada del número para que sea más eficiente cierto? (Osea, tarde menos tiempo)

Está bien aunque es sencillo, y no comprueba si el 1 es primo o no (no digas nada) :xD
No es necesario recorrer cada numero, con llegar a la raiz es suficiente :) No dire nada sobre el 1 :rolleyes: :xD
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #6 en: 7 Julio 2010, 13:04 pm »

Código
  1. '0 ---> Invalido
  2. '1 ---> No Primo
  3. '2 ---> Primo
  4. Option Explicit
  5. Private Function Check_Prime_Number(ByVal lNumber As Long) As Byte
  6.    Dim x            As Long
  7.    If lNumber >= 2 Then
  8.        Check_Prime_Number = 2
  9.        For x = 2 To (lNumber ^ 0.5)
  10.            If (lNumber Mod x) = 0 Then
  11.                Check_Prime_Number = 1
  12.                Exit For
  13.            End If
  14.        Next
  15.    End If
  16. End Function
« Última modificación: 7 Julio 2010, 14:51 pm por *PsYkE1* » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #7 en: 7 Julio 2010, 13:07 pm »

@Psyke: Tu función es mucho mas lenta, ademas, no tiene en cuenta que el 2 es primo (como hacia la mia :rolleyes: :xD)
No es necesario que recorras todos los números, con llegar a la raiz es suficiente ;)
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #8 en: 7 Julio 2010, 14:41 pm »

Ok, agradezco la correcion, lo no tuve en cuenta :P
Ahora lo corregi!

Salu2! ;)
En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #9 en: 8 Julio 2010, 09:17 am »

Código:
Private Function CheckPrimality(ByVal lNum As Long) As Boolean
    Dim i       As Long
    Dim lSqr    As Long
       
    If lNum Mod 2 = 0 Then GoTo Composite:

    lSqr = Sqr(lNum)

    i = 3
    Do Until i > lSqr
        If lNum Mod i = 0 Then GoTo Composite:
        i = i + 2
    Loop
   
Prime:
    CheckPrimality = True
    Exit Function
Composite:
    If lNum = 2 Then CheckPrimality = True
End Function
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

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