Buscando los números primos, en Java

Iniciado por Yavi, Junio 08, 2015, 07:27:59 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Hola, como están?  8)

Últimamente estaba programando en Java y allí estaba yo realizando actividades y cosas por el estilo. Me tope con un algoritmo, pero no me funciono a la perfección, entonces decidí mejorarlo. Aquí esta:

Este algoritmo calcula todos los números primos desde 1 (lo cual es raro, porque el uno no se incluye  :P ) hasta el valor de la variable limite

Código: java

package DelDia;

public class BuscandoAlPrimo {

public static void main(String[] args)
{
System.out.println("INICIO");
double limite = 100000;
for (double numero=2.0; numero<=limite; numero++)
{
int nPrimos = 1;
for (int divisor=2; divisor <= (numero); divisor++)
{
if ((numero % divisor) == 0)
{
nPrimos++;
}
}
// fin de la comprobacion :P
if (nPrimos==2){
System.out.println("Se encontro:  " + numero);
}
}
System.out.println("FIN :P ");

}

}




Bueno, espero que se muy útil ;D 
"Eso es lo bueno de internet. De que sirve internet si chateas con tus vecinos??? para eso te sacas unas sillas al fresco y hablais y jugais a las cartas". @windux

No Funciona. No lo he probado pero se que no funciona... lo probaste? 8)

Junio 09, 2015, 05:37:43 PM #2 Ultima modificación: Junio 10, 2015, 06:40:53 PM por Gus Garsaky
He hecho una solución siguiendo la Criba de Erastóstenes.

Código: java

package mathio;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
* Math util methods and classes
* @author Gustavo Garsaky
* @version 0.0.1
*/
public class MathUtils {

public PrimeNumbers primeNumbers() {
return new PrimeNumbers();
}

private class PrimeNumbers {

public List<Integer> listPrimesUntil(int limit) {
List<Integer> naturals = new CopyOnWriteArrayList<>();
// init naturals
for(int i=2; i<=limit; i++) {
naturals.add(i);
}
for(Integer current : naturals) {
discardMultiples(naturals, getMultiplesOf(current, naturals.size()));
// if discard continue, that means the process should continue
if(discard(current, naturals.size())) {
continue;
} else {
break;
}
}
List<Integer> primes = naturals;
return primes;
}
/**
* check the first natural quad. If it's
* less tan limit, process should continue
* @param firstNatural first natural number
*/
private boolean discard(int firstNatural, int limit) {
double firstNaturalQuad = Math.pow(new Double(String.valueOf(firstNatural)), 2.0d);
if(firstNaturalQuad <= limit) {
return true;
}
return false;
}
/**
* Get new list of natural numbers. The new list have all numbers
* that not in multiples of first natural number
* @param naturals Naturals numbers
* @param number Number to get multiples
*/
private void discardMultiples(List<Integer> naturals, List<Integer> multiples) {
// check if each multiple is in naturals list.
// if it isn't, append the multiple to new list
for(int i=0; i<multiples.size(); i++) {
             for(int k=0; k<naturals.size(); k++) {
                           if(multiples.get(i) == naturals.get(k)) {
                     naturals.remove(k);
                                  }
             }   
}   
}
} // end private class


/**
* Get the multiples of a number with some limit
* @param number Number to get multiples
* @param limit of multiples to get
*/
public static List<Integer> getMultiplesOf(int number, int limit) {
List<Integer> multiples = new ArrayList<>();
for(int i=number; i<limit; i++ ) {
if(i < limit) {
multiples.add(number * i);
}
}
return multiples;
}
public static void main(String[] args) {
PrimeNumbers primeNumbers = new MathUtils().primeNumbers();
List<Integer> primes = primeNumbers.listPrimesUntil(100);
    System.out.println("[+] Listando numeros primos...\n");
for(Integer prime : primes) {
System.out.println(prime);
}
}
}


Awwwww  :( :-[
"Eso es lo bueno de internet. De que sirve internet si chateas con tus vecinos??? para eso te sacas unas sillas al fresco y hablais y jugais a las cartas". @windux