1 minute read

Mention : 에라토스테네스의 채🧺, Math.sqrt (제곱근)을 사용하는 방법이 있지만 다른 방법으로 구현해보았다.

소수 구하기

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 256 MB 214645 60735 42768 26.569%

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

예제 입력 1

3 16

예제 출력 1

3
5
7
11
13

출처

슈도 코드

M(시작 자연수)
N( 자연수)
A(N까지의 자연수 배열)

for(N+1만큼) {
	A배열에 자연수 저장
}

소수 구하기 (A배열에서 소수가 아닌 것을 0으로 바꿔준다.)
에라토스테네스의  사용
delete 함수 구현
for(A배열의 길이만큼) {
		if (A의 값이 1,4,6,8,9라면 delete 함수 수행, 0으로 바꿔줌)
		else delete 함수 수행
	}
for(A배열의 길이만큼) {
	if(0 아니라면 그리고 M보다 크거나 같다면)
	출력
}

delete 함수 구현
j = 1;
A = 변수 배열
while(A값이 A배열의 끝자리와 같을때 까지) {
	if(0이나 1이면) break;
	if(배수 인덱스가 A배열의 길이를 초과하면) break;
	A[배수인덱스] 0으로 바꿔준다.
	j++
}

Code

package numberTheory;

import java.util.Scanner;

public class P1929_getPrimeNumber {
	static int j;
	static int[] A;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int M = sc.nextInt();
		int N = sc.nextInt();

		A = new int[N+1];

		for (int i = 1; i < N+1; i++) {
			A[i] += i;
		}

		for (int i = 1; i < A.length; i++) {
			if (A[i] == 1 || A[i] == 4 || A[i] == 6 || A[i] == 8 || A[i] == 9) {
				delete(A, i);
				A[i] = 0;
			} else {
				delete(A, i);
			}
		}

		for (int i = 0; i < A.length; i++) {
			if (A[i] != 0 && A[i] >= M) {
				System.out.println(A[i]);
			}
		}
	}

	private static void delete(int[] arr, int i) {
		j = 1;
		A = arr;
		while (A[i] != A[A.length - 1]) {
			if (A[i] == 0 || A[i] == 1) {
				break;
			}
			if (i + (A[i] * j) >= A.length) {
				break;
			}
			A[i + (A[i] * j)] = 0;
			j++;
		}
	}
}

Leave a comment