본문 바로가기

PS_Baekjoon

[백준 C++] 2581번 : 소수

https://www.acmicpc.net/problem/2581

 

2581번: 소수

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

www.acmicpc.net

풀이 :

- 주어진 m과 n사이의 소수를 구해서, 그 합과 최솟값을 출력

- 소수가 없다면 -1출력

-m의 최대값이 10,000이기 때문에 시간 초과가 날 일은 없어서 1부터 i의 값까지 다 돌려서 소수를 구해줘도 된다.

 

코드 :

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    int n, m, sum, smallest, prime;

    cin >> m >> n;
    sum = 0;
    smallest = -1;
    for(int i = m; i <= n; i++){ //m이상 n이하
        prime = 0; 
        for(int j = 1; j <= i; j++){ //소수 찾는 for문
            if (i%j == 0){ //1부터 i까지 나머지가 0이라면 카운트
               prime++;
            }
        }
        if(prime == 2){ //1과 자신만으로 나눠지는 수가 소수.
            sum += i; //즉, 카운트 된 값이 2라면 소수
            if (smallest < 0){ //가장 처음 만나는 소수가 제일 작은 소수이라서,
                smallest = i; //처음 초깃값 -1일 때만 if문에 들어감
            }
        }
    }
    if(smallest > 0){ //소수를 찾았다면 소수의 합 출력
        cout << sum << '\n';
    }
    cout << smallest << '\n'; //소수를 못 찾았다면 -1일 출력되고, 그렇지 않으면 최솟값이 출력됨
}