Eu estou tentando implementar Crivo de Eratóstenes, mas ele funciona apenas para números menores, então, 33

hereToAsk:

Estou tentando escrever um programa para o Crivo de Eratóstenes e ele funciona, mas se o número de entrada é de 33 ou maior eu recebo este erro:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:373)
    at java.base/java.util.ArrayList.get(ArrayList.java:425)
    at Main.main(Main.java:23)

este é o código que eu usei

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);
        int nr = read.nextInt();

        ArrayList<Integer> listA = new ArrayList<Integer>();
        ArrayList<Integer> listB = new ArrayList<Integer>();

        for (int i = 2; i <= nr; i++)
                listA.add(i);
        //System.out.println(listA);
        int m = 2;
        listB.add(m);
        while (m <= nr-2) {
            listA.removeAll(Arrays.asList(m));
            for (int j = m*2; j <= nr; j = j + m) {
                listA.removeAll(Arrays.asList(j));
            }
            m = listA.get(0);
            listB.add(m);
        }
        System.out.println(listB);

    }
}
HomeIsWhereThePcIs:

Quando você começa o java.lang.IndexOutOfBoundsExceptionque significa que nesse momento já retirou todos os números de listA, então você não pode fazerlistA.get(0)

Gostaria de declarar uma matriz de booleanos e defini-los todos para true. Você pode fingir estes são números de 0-n.

Em seguida, defina cada número non-prime como falsa, começando com 2 e definindo múltiplos false, etc. Antes multiplicando você pode verificar se esse número já está definido para false, que significa multiplicar esse número não é necessário, uma vez que todos os múltiplos já estão definidos como falsa. Isso torna significativamente mais rápido o algoritmo.

Finalmente imprimir todos os números primos a partir de 2.

Você pode remover Arrays.fillpara torná-lo mais eficiente, mas então você precisa de inverter toda a outra lógica, uma vez boolean será o padrão para falso.

        boolean[] primeNumbers = new boolean[nr + 1];
        Arrays.fill(primeNumbers, true);

        int m = 2;
        while (m <= Math.sqrt(nr)) {
            if (primeNumbers[m])
                for (int j = m * 2; j <= nr; j = j + m) {
                    primeNumbers[j] = false;
                }
            m++;
        }

        for (int i = 2; i <= nr; i++) {
            if (primeNumbers[i]) System.out.println(i);
        }

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=293176&siteId=1
Recomendado
Clasificación