private void cribaEratostenes2(long n)
    {
        long k, pos;
        long numMaxPrimos = (n - 3) / 2;
        long numPrimos = 0;
        
        long[] primos = new long[(int)numMaxPrimos + 1];
        boolean[] esPrimo = new boolean[(int)numMaxPrimos + 1];
        
        for(long i=0; i < numMaxPrimos; i++)
            esPrimo[(int)i] = true;
        
        for(long i=0; i*i < n; i++){
            k = i + 1;
            if(esPrimo[(int)i]){
                for(long p=i+1; (2*k+1)*(2*i+3) <= n; k++){
                    pos = ((2*p+1)*(2*i+3)-3) / 2;
                    esPrimo[(int)pos] = false;
                }
            }
        }
        
        //mostrar los números primos y almacenarlos en vector
        System.out.println("2");
        for(int i=0; i<= numMaxPrimos + 1; i++){
            if(esPrimo[i]){
                numPrimos++;
                primos[(int)numPrimos] = 2 * i + 3;
                System.out.print(" " + primos[(int)numPrimos]);
            }
        }
        
            
        
    }