[BOJ][실1][6588] 골드바흐의 추측
문제 링크
첫 번째 풀이 : 소수
알고리즘
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int n = 0;
const int MAX = 10010;
bool isPrime[MAX+1];
int main(void) {
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MAX = 1'000'000;
ll n, m;
bool isPrime[MAX + 1];
vector<ll> prime(MAX);
int pidx = 0;
int main()
{
//freopen("input.txt", "r", stdin);
//ios_base::sync_with_stdio(0); cin.tie(0);
memset(isPrime, true, sizeof(isPrime));
isPrime[1] = false;
for (ll i = 2; i * i <= MAX; i++) {
if (!isPrime[i]) continue;
prime[pidx++] = i; // 소수를 저장
for (ll j = i * i; j <= MAX; j += i) {
isPrime[j] = false;
}
}
while (true) {
scanf("%d", &n);
if (n == 0) break;
bool flag = false;
// prime[0] = 2이므로 제외
for (int i = 1; i < pidx; i++) {
if (isPrime[n - prime[i]]) {
printf("%lld = %lld + %lld\n", n, prime[i],n - prime[i]);
flag = true;
break;
}
}
if (!flag) {
printf("Goldbach's conjecture is wrong.\n");
}
}
return 0;
}
Success Notice: 소수 개념을 사용한 문제를 풀어봤습니다. 수고하셨습니다.
Leave a comment