잡동사니/[2022] 회로이론
[백준/Java] 1929번 소수 구하기 (에라토스테네스의 체)
heylo
2023. 1. 10. 01:31
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
for (N의 제곱근까지 반복하기)
{
소수가 아니면 넘어감
for (소수의 배수 값을 N까지 반복하기)
{
이 수가 소수가 아니라는 것을 표시하기
( 0으로 값을 변경 )
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
// 에라토스테네스의 체
// 소수 구하기
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// M 이상 N 이하의 자연수
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
// 배열
int size = N + 1; // 큰 수보다 1 크게, 인덱스 1부터 시작하므로
int[] A = new int[size];
// 배열 초기화하기
for (int i = 2; i <= N; i++)
{
A[i] = i;
}
// 에라토스테네스의 체
// 1은 소수가 아니므로 2부터 시작해서 마지막 수의 제곱근까지
for (int i = 2; i <= Math.sqrt(N); i++)
{
if (A[i] == 0) // 지워진 수이면
{
continue;
}
// 배수 지우기
for (int k = i + i; k <= N; k = k + i)
{
A[k] = 0;
}
}
// 소수 출력하기
for (int i = M; i <= N; i++)
{
if(A[i] != 0)
{
System.out.println(A[i]);
}
}
br.close();
}
}