Se trata de que en lugar de usar una variable para saber si toca sumar 2 y luego 4, hacer esas operaciones de forma secuencial duplicando código.
Es verdad que el programa ahora es más feo y que algunas veces se sobrepasa el límite que ha fijado el usuario, pero el código es ligeramente más rápido así que yo creo que hay que darlo por bueno.
Los tiempos son:
Para un límite fijado en 100.000.000 la versión anterior tardaba 2 horas 17 minutos 26 segundos y ahora tarda 2 horas 14 minutos 58 segundos.
Dim candidato As Long = 5
Dim pruebaDivisor As Long
Dim esPrimo As Boolean
Dim numPrimos As Long = 2
Me.lblInicio.Text = ""
Me.lblFIn.Text = ""
Me.lblInicio.Text = Now
lstPrimos.BeginUpdate()
Me.lstPrimos.Items.Add(2)
Me.lstPrimos.Items.Add(3)
Me.lblNumPrimos.Text = numPrimos
Me.lblNumPrimos.Refresh()
While candidato <= Val(Me.txtLimiteSuperior.Text)
pruebaDivisor = 5
esPrimo = True
While pruebaDivisor * pruebaDivisor <= candidato
If candidato Mod pruebaDivisor = 0 Then
esPrimo = False
Exit While
End If
pruebaDivisor += 2
End While
If esPrimo Then
Me.lstPrimos.Items.Add(candidato)
numPrimos += 1
Me.lblNumPrimos.Text = numPrimos
Me.lblNumPrimos.Refresh()
End If
candidato += 2
pruebaDivisor = 5
esPrimo = True
While pruebaDivisor * pruebaDivisor <= candidato
If candidato Mod pruebaDivisor = 0 Then
esPrimo = False
Exit While
End If
pruebaDivisor += 2
End While
If esPrimo Then
Me.lstPrimos.Items.Add(candidato)
numPrimos += 1
Me.lblNumPrimos.Text = numPrimos
Me.lblNumPrimos.Refresh()
End If
candidato += 4
End While
lstPrimos.EndUpdate()
Me.lblFIn.Text = Now
No hay comentarios:
Publicar un comentario