0
I have the following problem: I need a program that receives an even positive number and forms a "training wheel" with these numbers, so that:
- All numbers from 1 to n are used in the circle only once.
 - The sum of two consecutive numbers is a prime number.
 - The sum of a number with that which is diametrically opposed to it is also a prime number.
 
For example, an 18 number wheel would be displayed in the following vector form: 1 6 7 16 15 8 5 12 11 18 13 10 3 4 9 14 17 2.
I have the following code, but if you run it, you will see that you can leave it running and take a trip to visit relatives who live far away, and maybe when you come back, it will result in something. I need to optimize it and, if possible, rotate in less than a minute:
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JOptionPane;
/**
* Desafio 5
*
* @author Conan,O Barbaro
*/
public class QuintoDesafio {
    private static int j;
    private static int k;
    static final long longLimit = (long) 500;
    private static Vector primos  = new Vector();
    public static void main(String[] args)
    {
        long inicio = System.currentTimeMillis();
        ArrayList lista = new ArrayList();
        ArrayList<Long> primos = new ArrayList<Long>();
        long longNumber = 5;
        int intNext = 0, intIndex = 0;
        double doubleSquareRoot = 0.0;
        primos.add(new Long(2));
        primos.add(new Long(3));
        do {
            intNext = 0;
            doubleSquareRoot = Math.sqrt(longNumber);
            while ((double) primos.get(++intNext) < doubleSquareRoot && (longNumber % primos.get(intNext)) != 0);
            if ((double) primos.get(intNext) > doubleSquareRoot)
                primos.add(new Long(longNumber));
            longNumber += ((longNumber % 3 == 2) ? 2 : 4);
        } while (longNumber < longLimit);
        String n = JOptionPane.showInputDialog("Informe n (par) ");
        int ene = Integer.parseInt(n);
        for (int i=1; i <= ene; i++) {
            lista.add(new Integer(i));
        }
        permuta(lista, 0);
        long fim = System.currentTimeMillis();
        System.out.println(new SimpleDateFormat("ss.SSS").format(new Date(fim - inicio)));
    }
    static void permuta(ArrayList arr, int k)
    {
        boolean passou = true;
        for(int i = k; i < arr.size(); i++){
            java.util.Collections.swap(arr, i, k);
            permuta(arr, k + 1);
            java.util.Collections.swap(arr, k, i);
        }
        if (k == arr.size() - 1){
            int metade = arr.size() / 2;
            for (int j=0; j < arr.size(); j++) {
                int um = (int) arr.get(j);
                int dois;
                if (j+1 == arr.size()) {
                    dois = (int) arr.get(0);
                } else {
                    dois = (int) arr.get(j+1);
                }
                Integer numteste = new Integer(um + dois);
                if (!primos.contains(numteste)) {
                    passou = false;
                }
            }
            for (int j=0; j<metade; j++) {
                int um = (int) arr.get(j);
                int dois = (int) arr.get(j + metade);
                Integer numteste = new Integer(um + dois);
                if (!primos.contains(numteste)) {
                    passou = false;
                }
            }
            if (passou) {
                System.out.println(java.util.Arrays.toString(arr.toArray()));
            }
        }
    }
}
						
Have some special reason to be using wrapper classes instead of using primitive types?
– fernandosavio
I would start by avoiding a recursion within a for.
– fernandosavio