반갑습니다!

[백준] 6588 골드바흐의 추측 본문

알고리즘 문제 풀이

[백준] 6588 골드바흐의 추측

김덜덜이 2020. 4. 20. 22:45

풀이

에라토스테네스의 체를 사용해서 소수를 모두 구한 뒤, 3부터 시작해서 수를 탐색하기 시작한다. 가장 작은 홀수 소수인 3부터 홀수만 탐색하므로 처음으로 발견되는 두 수의 차이가 가장 크다는 것을 보장할 수 있다.

코드

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

bool chk[1000001];

void precalc() {
    fill(chk, chk + 1000001, true);
    chk[1] = false;
    for (int i = 1; i * i <= 1000000; i++) {
        if (!chk[i]) continue;
        for (int j = i * i; j <= 1000000; j += i) 
            chk[j] = false;        
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    precalc();
    while (true) {
        int n;
        cin >> n;
        if (n == 0) break;
        bool find = false;
        // 3부터 시작해서 홀수만 탐색
        for (int i = 3; i < n; i += 2) {
            // i와 n-i가 모두 소수인 경우
            if (chk[i] && chk[n - i]) {
                find = true;
                cout << n << " = " << i << " + " << n - i << '\n';
                break;
            }
        }
        if (!find) cout << "Goldbach's conjecture is wrong.\n";
    }
    return 0;
}

'알고리즘 문제 풀이' 카테고리의 다른 글

[백준] 1063 킹  (0) 2020.04.22
[SWEA] 1486 장훈이의 높은 선반  (0) 2020.04.21
[백준] 15486 퇴사 2  (0) 2020.04.20
[백준] 17779 게리맨더링 2  (0) 2020.04.20
[백준] 2407 조합  (0) 2020.04.20