알고리즘 문제풀이 - 소수 판별2

한창희·2022년 1월 1일

문제

자연수n,m이 주어질 때, n부터m까지 존재하는 소수를 모두 출력하는 프로그램을 작성하여라. 여기서 소수란, 약수가 1과 자기자신밖에 존재하지 않는 수를 말한다.


입력

첫째 줄에 자연수 n, m이 주어진다. (1≤n,m≤20,000)


출력

첫째 줄에 n부터m까지 존재하는 소수를 모두 출력한다.


예제 입력

1 10

예제 출력

2 3 5 7


예제 입력

13 30

예제 출력

13 17 19 23 29



  • n,m의 대소비교를 먼저 수행해야 한다
  • 에라토스테네스의 체 개념을 적용


#include <stdio.h>
#include <iostream>
#include <cmath>

using namespace std;

int N, M;

int numArray[20010] = { 0, };

int main() {

	scanf("%d %d", &N, &M);

	int large, small;

	if (N >= M) {
		large = N;
		small = M;
	}
	else {
		large = M;
		small = N;
	}


	// 숫자 배열 채우기
	for (int i = 1; i <= large; i++)
		numArray[i] = i;

	// large 까지의 소수를 모두 구한다 -> 소수는 자신의 값 할당,  소수가 아니면 0값을 할당!!  // 자연수 1은 소수 아니다
	for (int i = 2; i <= sqrt(large); i++) {  // 반복 횟수는 구하려는 범위 값의 제곱근 -> 모든 가능한 배수들을 판단하므로 제곱근이하 까지만 반복하여
												// 소수가 아닌 수를 모두 찾을 수 있다!!
	
		if (numArray[i] != 0) {
		
			int count = 2;
			int mul = numArray[i] * count;

			while (mul <= large) {
				numArray[mul] = 0;  // 소수가 아닌 수에 0 할당

				count++;
				mul = numArray[i] * count;
			}
		}
	}


	for (int j = small; j <= large; j++) {
		
		if (numArray[j] != 0 && numArray[j] != 1)
			printf("%d ", numArray[j]);
	}

	return 0;
}
profile
매 순간 최선을 다하자

0개의 댓글