[BOJ][실1][9020] 골드바흐의 추측
문제 링크
첫 번째 풀이 : 소수
알고리즘
Info Notice: 소수를 판별하는 방법1은 소수가 아닙니다. 25를 생각했을 때 2~5(제곱급)까지의 수 중에서 25를 나누어 떨어지게 하는 수가 있으면 안됩니다. 1과 자기 자신만 약수일 수 있기 때문입니다. 또는 에라토스테네스의 체를 사용합니다.
이미 소수인지 판별해두었기 때문에 O(N)으로 진행할 수 있습니다.
정답 코드
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int n = 0;
const int MAX = 10010;
bool isPrime[MAX+1];
int main(void) {
//freopen("input.txt", "r", stdin);
memset(isPrime, true, sizeof(isPrime));
isPrime[1] = false;
// MAX까지 소수인지 아닌지 판단
for (int curr = 2; curr <= MAX; curr++) { // curr : MAX의 약수 후보
if (isPrime[curr]) {
for (int next = curr * curr; next <= MAX; next += curr) {
isPrime[next] = false;
}
}
}
int tc = 0;
cin >> tc;
while (tc--) {
int n = 0; cin >> n;
int a = 0, b = 0, diff = 987654321;
for (int i = 2; i <= n / 2; i++) {
if (!isPrime[i]) continue;
if (isPrime[n - i]) {
if (diff > (n - i) - i) {
a = i;
b = n - i;
}
}
}
cout << a << " " << b << "\n";
}
return 0;
}
Success Notice: 소수 개념을 사용한 문제를 풀어봤습니다. 수고하셨습니다.
Leave a comment