https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
vector<int>check(n+1, 1);
check[1] = 0;//1은 소수가 아니다.
for (int i = 2; i * i <= n; i++)
{
if (check[i])
{
for (int j = 2 * i; j <= n; j += i)
{
if (check[j])
check[j] = 0;
}
}
}
for (int i = m; i <= n; i++)
{
if (check[i])
cout << i << "\n";
}
}
이 문제는 에라토스테네스의 체를 사용해야 한다.
2부터 n까지의 배열이 있다면,
i=2부터 해서 i를 1씩 늘려가며 i의 배수들을 지워주는 것이다. 언제까지? i*i<=n까지!
i의 배수들을 지우고 있기 때문에, i<=n까지 갈 필요가 없다.
초기에 check 벡터를 1로 세팅하고, 배수에 해당하는 수는 0으로 세팅하였다.
1은 소수가 아니므로 0으로 세팅하여야 한다.
check=1로 살아남은 수는 소수! 출력하면 된다.
'문제를 풀자' 카테고리의 다른 글
[프로그래머스] 신고 결과 받기(C++) (0) | 2022.06.22 |
---|---|
[SWEA #8016] 홀수 피라미드(C++) (0) | 2022.05.31 |
[백준 #16563] 어려운 소인수분해(C++) (0) | 2022.05.31 |
[백준 #1978] 소수 찾기(C++) (0) | 2022.05.30 |
[백준 #1037] 약수(C++) (0) | 2022.05.30 |
댓글