알고리즘/문제 풀이
1929번: 소수 구하기
Themion
2021. 12. 10. 20:41
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
전형적인 에라토스테네스의 체 문제이다. 1부터 N 사이의 소수를 구한 뒤, M부터 N까지의 소수를 출력하면 된다.
#include <cstdio>
#define MAX_N 1000000
// era[i]: i가 소수라면 false, 아니라면 true
bool era[MAX_N + 1] = { true, true, };
int main() {
// M, N : 소수의 범위, k : 소수를 구할 때 쓸 곱셈수
int M, N, k;
scanf("%d %d", &M, &N);
// 2부터 N까지 모든 수에 대해
for (int i = 2; i <= N; i++) {
// 2 이상을 곱해서 나온 수는 모두 소수가 아니다
k = 2;
// i * k가 N 초과라면 굳이 할 필요가 없다
while (i * k <= N) era[i * k++] = true;
}
// era에서 소수인 수들만 골라 출력한다
for (int i = M; i <= N; i++) if (!era[i]) printf("%d\n", i);
return 0;
}