M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
🔍 에라토스테네스의 체 알고리즘이 효율적인 이유는 숫자가 들어올 때마다 소수인지 연산을 안하고 이미 연산 된 배열에서 맞는지 아닌지만 return 해주어서 그렇다. 어떻게 보면 다음 장에서 다룰 다이내믹 프로그래밍의 일종이라고 할 수 있을 것 같다.
#include <iostream>
using namespace std;
bool prime[1000001] = {false, false}; //0과 1은 소수가 아니므로 false로 초기화
int main(){
int min, max;
//입력
cin >> min >> max;
//에라토스테네스의 체 구현
for(int i = 2; i <= max; i++) prime[i] = true; //모든 배열 값 true로 초기화
for(int i = 2; i <= max; i++){
//이미 false로 바뀐 수는 무시
if(prime[i] == false) continue;
//2부터 max까지 모든 배수 인덱스를 가진 값을 0으로 바꿈
for(int j = i+i; j <= max; j+=i) prime[j] = false;
}
//출력
for(int i = min; i <= max; i++){
//소수인 경우에 인덱스 값 출력
if(prime[i]) cout << i << '\\n';
}
}