Autor
|
Tema: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo (Leído 17,431 veces)
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Bueno, me hacia falta hacer una funcion de este tipo para un trabajito que estoy haciendo ... y he pensado que tal vez os seria util... 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
Podriamos hacer un jueguecito... a ver quien lo hace mas rapido/corto Os apuntais? MOD: Yo utilizo este codigo para comprobar lo optimizado que esta: 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
Mensajes: 147
|
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
Mensajes: 2.416
Se siente observado ¬¬'
|
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 ( 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
Mensajes: 147
|
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
Mensajes: 277
|
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)
|
|
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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
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) No es necesario recorrer cada numero, con llegar a la raiz es suficiente No dire nada sobre el 1
|
|
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.089
|
'0 ---> Invalido '1 ---> No Primo '2 ---> Primo Option Explicit Private Function Check_Prime_Number(ByVal lNumber As Long) As Byte Dim x As Long If lNumber >= 2 Then Check_Prime_Number = 2 For x = 2 To (lNumber ^ 0.5) If (lNumber Mod x) = 0 Then Check_Prime_Number = 1 Exit For End If Next End If End Function
|
|
« Última modificación: 7 Julio 2010, 14:51 pm por *PsYkE1* »
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
@Psyke: Tu función es mucho mas lenta, ademas, no tiene en cuenta que el 2 es primo (como hacia la mia ) No es necesario que recorras todos los números, con llegar a la raiz es suficiente
|
|
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.089
|
Ok, agradezco la correcion, lo no tuve en cuenta Ahora lo corregi! Salu2!
|
|
|
En línea
|
|
|
|
cobein
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Verdad que es imposible el algoritmo numero primo sin usar ciclos, ni funciones.
« 1 2 »
Programación General
|
Aikanáro Anário
|
11
|
11,662
|
20 Agosto 2011, 01:12 am
por someRandomCode
|
|
|
Factor primo más grande de un número muy largo
Programación C/C++
|
DickGumshoe
|
9
|
9,101
|
5 Julio 2012, 04:01 am
por do-while
|
|
|
Descubren el mayor número primo: 17 millones de dígitos
Noticias
|
wolfbcn
|
2
|
2,751
|
7 Febrero 2013, 22:31 pm
por anonimo12121
|
|
|
Como saber si un numero grande es primo o no
Dudas Generales
|
Luish@o
|
1
|
7,255
|
18 Septiembre 2016, 18:25 pm
por engel lex
|
|
|
AYUDA! Verificar si un numero es par/impar , compuesto/primo
Programación C/C++
|
NicoSanhueza
|
1
|
1,944
|
7 Mayo 2018, 17:51 pm
por Serapis
|
|