본문 바로가기

[C언어] 백준온라인/* 수학 2

[C 언어] 백준 1929. 소수 구하기


1929. 소수 구하기 (누르면 해당 문제로 이동)

에라토스테네스의 체로 풀어 봅시다.

 

제약사항)

시간 : 2 초

메모리 : 256 MB

 

문제)

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

 

입력)

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1<=M<=N<=1,000,000)

 

출력)

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

 

입출력 예제

입력 출력
3 16 3
5
7
11
13

 


 

풀이 순서)

에라토스테네스의 체

위 링크에서 에라토스테네스의 체의 개념을 확인할 수 있습니다.

 

에라토스테네스의 체 개념을 이용하여 소수가 아니라면 num[n]=0을 대입하고,

num[M] ~ num[N] 사이에 그 값이 0인 경우 해당 인덱스 값을 출력합니다.

 


 

소스코드 및 결과 (C)

#include <stdio.h>
#include <math.h>

#define size 1000001

int num[size] = { 0, };

int main() {
	int M, N, i, j;
	int tmp = 0;

	for (i = 2; i < size; i++)
		num[i] = i;

	scanf("%d %d", &M, &N);
	tmp = (int)sqrt(N);

	for (i = 2; i <= tmp; i++) {
		if (num[i] == 0)
			continue;
		else {
			for (j = i + 1; j <= N; j++) {
				if (num[j] == 0)
					continue;

				if (num[j] % i == 0)
					num[j] = 0;
			}
		}
	}
	for (i = M; i <= N; i++) {
		if (num[i] != 0)
			printf("%d\n", i);
	}

	return 0;
}

 

메모리 : 5028 KB

시간 : 304 ms

코드길이 : 501 B