본문 바로가기
백준

[백준 1929] 소수 구하기, C++

by 황인태(intaehwang) 2020. 1. 9.
반응형

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

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000)

www.acmicpc.net

  본 문제는 소수 구하기 문제인데 입력 값이 1,000,000이다. 소수를 판단하는 알고리즘은

1
2
3
4
5
6
7
bool pnum (int n) {
    if (n < 2) return false;
    for (int i = 2; i*i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}
cs

로 구한다. 이때, 소수를 구하는 알고리즘의 시간 복잡도는 O(√n) 이다. 따라서, 1,000,000의 입력이 들어오면 10^6 * 10^3 = 10^9이므로 약 10초 정도의 시간이 필요하다. (그렇다고 안풀리는 건 아니다.) 대표적인 방법으로 '에라토스테네스의 체'가 있다. 자세한 내용은 링크를 참고 바란다.

에라토스테네스의 체

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
 
using namespace std;
 
int main() {
    bool chk[1000001];
    int n, m, cnt = 0;
    for (int i = 2; i <= 1000000; i++) {
        if (!chk[i]) {
            cnt += 1;
            for (int j = i*2; j <= 1000000; j += i) {
                chk[j] = true;
            }
        }
    }
    chk[0= true;
    chk[1= true;
    scanf("%d %d"&n, &m);
    for (int i = n; i <= m; i++) {
        if (!chk[i]) {
            printf("%d", i);
            if (i != m-1printf("\n");
        }
    }
}
cs

 

 

느린 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
bool prime(int n) {
    if (n < 2)
        return false;
    for (int i = 2; i*<= n; i++){
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
 
int main() {
    int n, m;
 
    cin >> n >> m;
 
    for (n; n <= m; n++) {
        if (prime(n)) {
            cout << n << '\n';
        }
    }
}
cs

 

반응형

'백준' 카테고리의 다른 글

[백준 1675] 팩토리얼 0의 개수, C++  (0) 2020.01.09
[백준 6588] 골드바흐의 추측, C++  (0) 2020.01.09
[백준 1037] 약수, C++  (0) 2020.01.08
[백준 4375] 1, C++  (0) 2020.01.08
[백준 1158] 요세푸스 문제, C++  (0) 2020.01.08
Buy me a coffeeBuy me a coffee

댓글