1929번: 소수 구하기

문제:

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';
	}
}