백준 2581: 소수

C++/Baekjoon 2023. 1. 29. 20:31

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.


입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.


출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.


코드

#include <iostream>
#include <cmath>

using namespace std;

static bool IsPrimeNumber(int _number)
{
    // :: 예외처리
	if (_number == 1) return false;
	if (_number == 2) return true;
	
    // :: 2부터 sqrt(_number)까지 나누어 떨어지는 수가 있는지 확인한다.
    int i;
    for (i = 2; i <= sqrt(_number); i++) if (_number % i == 0) return false;

    // :: 소수인 경우
    return true;
}
int main()
{   
    // :: 문제
    // :: 자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
    // :: 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 

    // :: 입력
    // :: 입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
    // :: M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

    // :: 출력
    // :: M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 
    // :: 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

    // :: 1. M과 N을 입력받는다.
    int M, N;
    cin >> M >> N;

    // :: 2. 소수인지 판별해서 합과 최소값을 구한다.
    int primeNumberMin = -1;
    int primeNumberSum = 0;
    for (int i = M; i <= N; i++)
    {
        if (IsPrimeNumber(i))
        {
            if (primeNumberMin == -1) primeNumberMin = i;
            primeNumberSum += i;
        }
    }

    // :: 3. 예외를 출력한다.
    if(primeNumberMin == -1) {
        cout << primeNumberMin << endl;
        return 0;
    }

    // :: 4. 합과 최소값을 출력한다.
    cout << primeNumberSum << endl;
    cout << primeNumberMin << endl;

    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 1978: 소수 찾기  (0) 2023.01.28
백준 11653: 소인수분해  (0) 2023.01.26
백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
블로그 이미지

RIsN

,