https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
(21.08.26)
1929번: 소수 구하기 - C언어 풀이
[소스코드]
#include <stdio.h>
// [baekjoon] 1929번 - 소수 구하기
int main() {
int num[1000001] = { 1,1, 0 };
int m, n;
scanf("%d %d", &m, &n);
for (int i = 2; i <= n; i++) {
if (num[i] == 0) {
for (int j = 2; i*j <= n; j++) {
num[i*j] = 1;
}
}
}
for (int i = m; i <= n; i++) {
if (num[i] == 0) printf("%d\n", i);
}
}
n이 최대 1,000,000이라서
에라토스 테네스의 체 방법을 이용해야 하는 문제이다.
최댓값 크기의 배열을 만들어 0으로 초기화한 다음,
소수가 아닌 수는 1을 대입하는 방식으로 지워나간다.
에라토스테네스의 체 방법을 간단히 요약하면,
2부터 시작해서, 소수인 수의 배수를 다 지우면
남은 수가 소수가 된다.
배수를 지울 때 코드를 잘못 짜서 헤맸었는데
for (int j = 2; i*j <= n; j++) {
num[i*j] = 1;
}
이런 식으로 배수만 찾아 지우는 반복문을 만들면 된다.
'학습 정리 > 👨💻 PS Study' 카테고리의 다른 글
[C] 백준 1759번 - 암호 만들기 (0) | 2022.07.08 |
---|---|
[C] 백준 4949번 - 균형잡힌 세상 (0) | 2022.07.08 |
[C] 백준 10951번 - A+B-4 (EOF 개념) (0) | 2022.07.08 |
[C] 백준 1283번 - 단축키 지정 (0) | 2022.07.08 |
[C] 백준 1475번 - 방 번호 (0) | 2022.07.07 |