본문 바로가기

Algorithm/Mathematics

BackJoon 1978 소수 찾기

Link https://www.acmicpc.net/problem/1978

소스결과 1984 KB / 0 ms

출처 Baekjoon

언어 C++ 17

분류 수학, 에라토스테네스의 체

 

설명

100개 이하의 주어진 수 중 소수인 수의 개수를 구하는 문제

 

분류에 적혀있는 에라토스테네스의 체를 연습하기 위한 문제이다.

2 이상의 수 에 대하여 소수인 수의 곱 값은 소수가 아니다 라는 정의를 이용한다.

대표적인 소수 2를 기준으로 4, 6, 8, 은 2의 곱이므로 소수가 될 수 없다.

현재 탐색하는 수가 과거의 수들을 기준으로 곱으로 판정이 되지 않았다면 해당 수는 소수로 판별 할 수있다.

 

위키 백과 - 에라토스테네스의 체 : https://ko.wikipedia.org/wiki/에라토스테네스의_체

 

알고리즘

1. 1부터 1000까지 포함할 수 있는 배열을 생성한다.

2. 배열을 에라토스테네스의 체 함수를 통해 초기화한다.

 2 - 1. 0과 1은 소수가 아닌 것으로 설정한다.

 2 - 2. 2부터 500까지 현재 자신의 값이 소수로 판별 되면 1000 이하의 수 중 나머지가 0이되는 모든 수를 소수가 아닌 것으로 판별한다.

3. 수 x를 입력 받으면서 소수 판별 배열의 값이 false이면 결과값을 +1 한다.

4. 출력

 

소스코드

#include <iostream>

using namespace std;

const short MAX = 1000;

void eratos(bool arr[MAX + 1]) {

	arr[0] = arr[1] = true;
	for (int i = 2; i < MAX / 2 + 1; i++)
	{
		if (!arr[i])
		{
			for (int j = i * 2; j < MAX; j += i)
				arr[j] = true;
		}
	}
}

int main()
{
	int n;
	bool prime[MAX + 1] = {};
	int count = 0;
	
	eratos(prime);

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		int k;

		cin >> k;

		if (!prime[k])
			count++;
	}

	cout << count;

	return 0;
}

 

'Algorithm > Mathematics' 카테고리의 다른 글

BaekJoon 1076 저항  (0) 2019.01.21
BaekJoon 1652 누울 자리를 찾아라  (0) 2019.01.21
BaekJoon 1094 막대기  (0) 2019.01.10
BaekJoon 2869 달팽이는 올라가고싶다.  (0) 2019.01.05
BaekJoon 1110 더하기 사이클  (0) 2019.01.05