https://www.acmicpc.net/problem/2581
2581번: 소수
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
www.acmicpc.net
에라토스테네스의 체를 이용해 입력받은 범위 내의 소수를 찾아내는 문제이다. 2부터 N까지의 모든 수에 대해 에라토스테네스의 체를 시행한 뒤, 범위 내의 모든 소수에 대해 합과 최솟값을 찾아 출력하면 된다.
#include <cstdio>
#define MAX_N 10000
int main() {
// prime[i]: i가 소수라면 false, 그렇지 않다면 true
bool prime[MAX_N + 1] = { 1, 1 };
// M, N: 범위로 주어지는 수, sum: 범위 내 소수의 합, min: 범위 내 소수의 최솟값
int M, N, sum = 0, min = MAX_N;
scanf("%d %d", &M, &N);
// N 이하의 모든 소수에 대해
for (int i = 2; i <= N; i++) if (!prime[i]) {
// 에라토스테네스의 체 실행
for (int j = i + i; j <= N; j += i) prime[j] = true;
// 소수가 M 이상이라면
if (i >= M) {
// 소수의 합과 최솟값을 갱신
if (min > i) min = i;
sum += i;
}
}
// 합이 존재한다면 합과 최솟값을, 그렇지 않다면 -1을 출력
sum ? printf("%d\n%d\n", sum, min) : printf("-1\n");
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
2606번: 바이러스 (0) | 2021.12.17 |
---|---|
2588번: 곱셈 (0) | 2021.12.17 |
2580번: 스도쿠 (0) | 2021.12.17 |
2579번: 계단 오르기 (0) | 2021.12.17 |
2577번: 숫자의 개수 (0) | 2021.12.17 |