PS/BOJ

백준 2581 (C++) 소수

akinakamori 2021. 9. 28. 21:02
728x90
SMALL

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

다양한 풀이가 있는 것 같아 내 것도 올려본다.

 

제곱근

 

소수가 아닌 N의 약수는 무조건 [1,N] 사이에 존재한다.

어떤 자연수 n이 소수인지 알기 위해서 제곱근 n까지만 진행하면 된다.

수가 수를 나누기 위해서 몫이 항상 필요하며 나누는 수와 몫 중 하나는 반드시 제곱근n 이하이기 때문이다.

나누는 수와 몫이 제곱근n을 좌우로 대칭이므로 제곱근값보다 같거나 작은 숫자로 나누어지면 그 이후는 계산을 할 필요가 없다.

때문에 계산이 간략해진다.

코드

#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
const int INF = 10001;
int ans = 0;

bool isPrime(int n) {
    if (n < 2) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n,m, prime_min = INF;
    cin >> m >> n;
    for (int i = m; i <= n; i++) {
        if (isPrime(i)) {
            prime_min = min(i, prime_min);
            ans += i;
        }
    }
    if (prime_min == INF) { // 소수의 최솟값이 없는 경우 == 소수가 없는 경우
        cout << "-1";
        return 0;
    }
    cout << ans << '\n' << prime_min;
    return 0;
}

 

728x90
LIST

'PS > BOJ' 카테고리의 다른 글

백준 10423 (C++) 전기가 부족해  (0) 2021.09.29
백준 2180 (C++) 소방서의 고민  (2) 2021.09.28
백준 1717 (C++) 집합의 표현  (0) 2021.09.28
백준 10984 (C++) 내 학점을 구해줘  (0) 2021.09.26
백준 4386 (C++) 별자리 만들기  (0) 2021.09.26