¿Como puedo calcular la suma de todos los numeros primos que se encuentren por debajo de 2 millones
Es que simplemente no se como encontrar los numeros primos que esten por debajo y la verdad ya me quebre el coco buscando la respuesta :(
- Inicie sesión o regístrese para enviar comentarios
Euler
Este es un problema de Project Euler. Simplemente comienza a generar números primos hasta llegar a 2 millones.
Dicho de otra forma: Un contador de 1 a 2000000, evaluando si el número actual es primo y en ese caso lo sumas a un total. Es todo.
Coding Kata
Eso me recureda un Coding dojo que organizó VIveCodigo
http://vivecodigo.org/2012/01/19/podcast-12-de-la-temporada-0/
Si el Rompecocos Project Euler
Muchas gracias la verdad de momento se ve complejo pero tiene solucion tambien :)
Números primos en Ceylon
Aqui esta mi solución en Ceylon
void run(){
Integer valor=2000000;
variable Integer suma:=0;
Boolean esPrimo(Integer numero){
variable Integer aux:=0;
variable Integer cont:=2;
while(cont<numero){
aux:=numero%cont;
if(aux==0){
return true;
}
cont++;
}
return false;
}
for(Integer n in 1..valor){
if(esPrimo(n)){
//print("" n " es primo");
suma:=suma+n;
}
}
print("suma obtenida: " suma "");
}
optimizaciones
Y una vez que obtienes la solución, la puedes empezar a optimizar en Ceylon:
1. No tiene caso iterar sobre números pares porque nunca van a ser primos, puedes descartarlos a todos
2. Para encontrar si un número es primo no tienes que dividir desde 2 hasta el mismo número; realmente puedes hacerlo desde 2 hasta la raíz cuadrada entera de dicho número (o si no quieres calcular eso pues hasta la mitad del número)
3. Puedes usar un
fold
sobre un iterable filtrado con los primos, o bien la funciónsum
que viene en el módulo de lenguaje, con una comprensión. Al final te queda de una línea:print(sum(for (i in (1..2000000).by(2)) if (isPrime(i)) i))
o bien
print((1..2000000).by(2).fold(2, (Integer a, Integer b) isPrime(b) then a+b else a))