| 
	
		|  Autor | Tema: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo  (Leído 19,383 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 IfExit_: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) ThenAl 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) ThenAl 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 ---> PrimoOption ExplicitPrivate 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 IfEnd 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 BooleanDim 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 | 12,804 |  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,938 |  5 Julio 2012, 04:01 am por do-while
 |  
						|   |   | Descubren el mayor número primo: 17 millones de dígitos Noticias
 | wolfbcn | 2 | 3,393 |  7 Febrero 2013, 22:31 pm por anonimo12121
 |  
						|   |   | Como saber si un numero grande es primo o no Dudas Generales
 | Luish@o | 1 | 7,552 |  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 | 2,286 |  7 Mayo 2018, 17:51 pm por Serapis
 |    |