나는 에라 토 스테 네스의 체를 구현하기 위해 노력하고 있지만, 만 작은 숫자 (33)를 작동

hereToAsk :

나는 에라 토 스테 네스의 체를위한 프로그램을 작성하기 위해 노력하고있어 그것은 작동하지만, 입력 번호가 33 이상인 경우이 오류를 얻을 :

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)

이것은 내가 사용하는 코드입니다

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 :

당신이 얻을 때 java.lang.IndexOutOfBoundsException그것은 그 시점에서 이미 모든 숫자를 제거 것을 의미 listA당신이 할 수 있도록,listA.get(0)

나는 논리 값의 배열을 선언하고 참으로 그들 모두를 설정합니다. 이러한 0-n은 숫자 척 할 수 있습니다.

그런 다음 모든 배수가 이미 설정되어 있기 때문에, 2로 시작하는 그 번호가 이미 false로 설정되어있는 경우이 수를 곱 수단이 필요하지 않다고, 확인할 수 있습니다 곱 전에 등을 허위로 배수를 설정하여 false로 모든 비 소수를 설정 false로. 이것은 상당히 빠른 알고리즘을합니다.

마지막으로 2에서 시작하는 모든 소수를 인쇄 할 수 있습니다.

당신은 제거 할 수 Arrays.fill는보다 효율적으로 할 수 있지만, 부울 false로 기본 때문에 당신은, 다른 모든 논리를 반전 할 필요가있다.

        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);
        }

추천

출처http://43.154.161.224:23101/article/api/json?id=293174&siteId=1