Discussion:
Algoritmo para calcular numeros primos
(demasiado antiguo para responder)
Álvaro José
2006-02-01 18:18:42 UTC
Permalink
Pues estuve intentando hacerlo y buscando por internet, pero no encuentro el
código, y si lo encuentro lo encuentro para C++ y no se ese lenguaje.

Pues bien, necesito que me ponga en un ListBox los numeros primos que se
encuentren entre 1 y un numero a elección del usuario.

Lo intente pero cada vez que lo intento o me saca los numeros pares, o me
saca los impares o solo me muestra el 0.

Espero que me podais ayudar.

Gracias.

Salu2.
Marcelo Soria
2006-02-01 18:47:06 UTC
Permalink
Lo que podés hacer es codificar el algoritmo que representa la Criba de
Eratostenes, es el único que puedo recomendarte (porque es el unico que
conozco :D )

es más o menos así, en pseudocodigo
i=nro elegido por el usuario
A={2,3,...,i}
indice=0
n=A[indice]
mientras indice<A .Largo() (*)
borrar todos los multiplos de n del Vector A;
indice++;
Mostrar todos los elementos de A

(*) se puede optimizar esta condicion, si queres lo discutimos
Post by Álvaro José
Pues estuve intentando hacerlo y buscando por internet, pero no encuentro el
código, y si lo encuentro lo encuentro para C++ y no se ese lenguaje.
Pues bien, necesito que me ponga en un ListBox los numeros primos que se
encuentren entre 1 y un numero a elección del usuario.
Lo intente pero cada vez que lo intento o me saca los numeros pares, o me
saca los impares o solo me muestra el 0.
Espero que me podais ayudar.
Gracias.
Salu2.
Guillermo Peralta
2006-02-01 18:57:17 UTC
Permalink
Hola Alvaro...
Apenas comienzo con C#, pero sé que alguna vez realice este algoritmo en C,
lamentablemente no lo tengo a mano, asi que modifique uno que encontre por
la red para adaptarlo, espero que te sirva.. no se si sera lo más optimo,
pero creo que funciona bien

En un formulario he colocado un listbox (lstNros), una caja de texto
(txtNro) y un boton de comando y el codigo es el siguiente:
private void button1_Click(object sender, EventArgs e)

{

int i = 1;

for (i = 1; i<= Convert.ToInt32 (txtNro.Text) ;i++)

{

if ( i == 1 || i== 2 || EsPrimo(i) == true )

{

lstNros.Items.Add (i) ;

}

}

}

public bool EsPrimo(int nro)

{

int i = 1;

int var = 0;

for (i = 1; i< nro - 1; i++)

{

if (nro % i == 0)

{

var ++;

}

}

if (var == 1)

return true;


else

return false;


}


Saludos
Guillermo
Post by Álvaro José
Pues estuve intentando hacerlo y buscando por internet, pero no encuentro
el código, y si lo encuentro lo encuentro para C++ y no se ese lenguaje.
Pues bien, necesito que me ponga en un ListBox los numeros primos que se
encuentren entre 1 y un numero a elección del usuario.
Lo intente pero cada vez que lo intento o me saca los numeros pares, o me
saca los impares o solo me muestra el 0.
Espero que me podais ayudar.
Gracias.
Salu2.
()()()()o: Nuevito
2006-02-02 19:37:59 UTC
Permalink
HOLa..
YO trabaje un algoritmo para una tarea una vez,
lamentablemente en esa ocacion lo realice en Lenguaje JAVA.
aqui te paso mi codigo para ver si te es util... es codigo JAVA.
pero visto que C# es una evolucion a partir de Java y C++ creo que
te sera familiar y facil de leer.. luego lo implemtentas utilizanod
componentes
de C#..... bueno, la logica del arlgoritmo debe ser la misma..

NOTA..
presta epecial atencion al metodo llamado "esPrimo" ahi es donde
se encuentra el algoritmo que te retorna un balor True o False, para saber
si un numero de los evaluados es primo o no.

Salu2
()()()()o: Nuevito

// Fuente: Metodos2.java
// Por ()()()()o: Nuevito 09/09/2005
// Victor Manuel Montoya Guardado

import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

public class Metodos2
{
public static void main(String args[])
{
int numero;
String sNumero;
String primo;
String out = "Numero\tEsPrimo";

JTextArea areaOut = new JTextArea(10,10);
JScrollPane scrollOut = new JScrollPane(areaOut);

do
{
sNumero = JOptionPane.showInputDialog("Ingresar Numero, " +
"Cero para Fin: ");
numero = Integer.parseInt(sNumero);

if(numero > 0)
{
if(Metodos2.esPrimo(numero) == true)
primo = "Si";
else
primo = "No";

out += "\n" + numero + "\t" + primo;
} //Fin if(numero > 0)
else
out += "\n--- Fin ---";
} while(numero >0);

areaOut.setText(out);
areaOut.setEditable(false);

JOptionPane.showMessageDialog(null,scrollOut,"Resultado",
JOptionPane.PLAIN_MESSAGE);

System.exit(0);
} //Fin metodo main

public static boolean esPrimo(int n)
{
boolean p = false;

if(n < 4)
p = true;
else
{
if(n%2 == 0)
p = false;
else
{
int divOk = 0;
int a = 1;
int lim = (n-1) / 2;

if(lim%2 == 0)
lim--;

while(a <= lim)
{
if(n%a == 0)
divOk++;

a += 2;

if(divOk == 2)
a = lim + 1;
} //Fin while(a <= lim)

if (divOk == 1)
p = true;
} //Fin else
} //Fin else
return (boolean) p;
} //Fin metodo esPrimo
} //Fin class Metodos2
Álvaro José
2006-02-01 19:49:27 UTC
Permalink
Muchas gracias... por fin lo he solucionado gracias a vuestros consejos y
codigos...

Llevo muy poco en C# y por ahora estoy aprendiendo y me costaba
desarrollarlo.

Salu2
Post by Guillermo Peralta
Hola Alvaro...
Apenas comienzo con C#, pero sé que alguna vez realice este algoritmo en
C, lamentablemente no lo tengo a mano, asi que modifique uno que encontre
por la red para adaptarlo, espero que te sirva.. no se si sera lo más
optimo, pero creo que funciona bien
En un formulario he colocado un listbox (lstNros), una caja de texto
private void button1_Click(object sender, EventArgs e)
{
int i = 1;
for (i = 1; i<= Convert.ToInt32 (txtNro.Text) ;i++)
{
if ( i == 1 || i== 2 || EsPrimo(i) == true )
{
lstNros.Items.Add (i) ;
}
}
}
public bool EsPrimo(int nro)
{
int i = 1;
int var = 0;
for (i = 1; i< nro - 1; i++)
{
if (nro % i == 0)
{
var ++;
}
}
if (var == 1)
return true;
else
return false;
}
Saludos
Guillermo
Post by Álvaro José
Pues estuve intentando hacerlo y buscando por internet, pero no encuentro
el código, y si lo encuentro lo encuentro para C++ y no se ese lenguaje.
Pues bien, necesito que me ponga en un ListBox los numeros primos que se
encuentren entre 1 y un numero a elección del usuario.
Lo intente pero cada vez que lo intento o me saca los numeros pares, o me
saca los impares o solo me muestra el 0.
Espero que me podais ayudar.
Gracias.
Salu2.
Manuel Gomez
2006-02-02 08:40:15 UTC
Permalink
Post by Álvaro José
Pues estuve intentando hacerlo y buscando por internet, pero no encuentro
el código, y si lo encuentro lo encuentro para C++ y no se ese lenguaje.
Pues bien, necesito que me ponga en un ListBox los numeros primos que se
encuentren entre 1 y un numero a elección del usuario.
Lo intente pero cada vez que lo intento o me saca los numeros pares, o me
saca los impares o solo me muestra el 0.
Espero que me podais ayudar.
Gracias.
Salu2.
L
a parte del LISTBOX es la mas chorra y te la dejo para que te entretengas
con listbox.add o algo así era (no quiero mirar el manual)

Este método es para que subas nota y el más rápido que conozco para calcular
si un número es primo o no.

Todo número no primo es divisible por él y también por su raíz cuadrada.
Ejs:
sqrt(1.000.000= 1.000
entre los 1.000 primeros números de N esta su divisor.
sqrt(4) = 2
entre los 2 primeros números de N esta su divisor.
sqrt(12) = 3.464101615137754587 entre los 3 primeros números de N esta su
divisor
etc......


public bool primo (int num) {
bool ret_primo = true;
int limit = 0, i = 1; // i = 1 porque i € N
limit = (int) Math.sqrt(num); // Aquí lee el manual de conversión de tipos
de double a int. CUIDADO CON LOS NÚMEROS NEGATIVOS. También paso de mirar
el manual para conversión de tipos.
while ( (num % i != 0) && (i <= limit) { i++; }
if (i != limit && i > 3) primo = false;
return ret_primo;
}

Continúe leyendo en narkive:
Loading...