백준 algorithm

백준 2581 - 소수

cosmohoo 2019. 9. 27. 15:54
반응형

문제 설명

에라토스테네스의 체를 사용하면 풀 수 있는 문제이다. 
기본적인 알고리즘은 쉽게 짰었는데 제대로된 예외처리를 못해서 5번 넘게 틀렸다....
2, 3, 5등은 소수인데 이 수들까지 소수가 아닌 것으로 인식을 되게 코드를 짜서 더 틀렸었다. 
작은 범위의 수들부터 정확히 따져보면서 코드를 짜야겠다. 

 

에라토스테네스의 체는 아래 URL에서 확인 가능하다.
https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수(소쑤)를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색) 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초

ko.wikipedia.org

 

#include <iostream>
#include <math.h>
using namespace std;
class Prime_Number
{
public :
	int number;
	bool prime=true;//true가 소수, false가 소수가 아니다. 
};
bool detec(int n)
{
	if (n <= 1)return false;
	for (int i = 2; i <= sqrt(n); i++) //keypoint 2 3 5 등은 true로 반환함
	{
		if(n%i==0)
		{
			return false;
		}
	}
	return true;
}


int main()
{
	int sum = 0;//소수의 합
	int min = 0;//가장 작은 소수
	int M, N, width;
	cin >> M >> N;
	width = N-M + 1;
	Prime_Number *arr = new Prime_Number[width];//배열 동적할당

	for (int i = 0; i < width; i++)//배열에 숫자 대입
	{
		arr[i].number = M;
		M++;
	}

	for (int j = 0; j < width; j++)
	{
		arr[j].prime = detec(arr[j].number);
	}

	for (int k = width-1; k >= 0; k--)
	{
		if (arr[k].prime)
		{
			min = arr[k].number;
			sum += arr[k].number;
		}
	}
	if(sum==0)
	{
		cout << -1 << '\n';
	}
	else {
		cout << sum << '\n' << min<<'\n';
	}
	return 0;
}
반응형