https://www.acmicpc.net/problem/6588
6588번: 골드바흐의 추측
문제 1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다. 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다. 예를 들어 8은 3 + 5로 나타낼 수 있고, 3과 5는 모두 홀수인 소수이다. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이다. 이 추측은 아직도 해결되지 않은 문제이다. 백만 이하의 모
www.acmicpc.net
문제에서 n의 범위는 (6 ≤ n ≤ 1000000)이다.
골드바흐의 추측은 10의 18 제곱까지는 증명되었다고 하므로
두 홀수 소수의 합으로 n을 나타낼 수 없는 경우에 "Goldbach's conjecture is wrong."을 출력하라고 문제에 나와있지만
안 해줘도 될 것 같다.
소수는 에라토스테네스의 체를 이용해서 n의 범위만큼 미리 구해서 배열에 저장한다.
n이 두 소수 p와 q로 이루어져 있다고 했을 때,
p + q = n
n - p = q
이므로 n에서 소수를 뺀 값이 소수이면 답을 바로 출력한다.
참고로 c++에서
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
를 써주면 입출력 속도를 높일 수 있다고 한다.
대신에 printf, scnaf 등은 사용하면 안 된다.
#include <iostream>
using namespace std;
const int MAX = 1000000;
int prime[MAX];
int cnt;
bool check[MAX+1];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//소수를 구해준다.
for(int i=2; i*i<=MAX; i++) {
//이미 소수가 아닌걸로 체크되어 있는 경우
if(check[i] == true) continue;
//위의 조건에 걸리지 않았다면 소수이므로 소수 배열에 추가
prime[cnt++] = i;
//현재 소수의 배수들은 소수가 아니므로 체크해준다.
for(int j=i+i; j<=MAX; j+=i) {
check[j] = true;
}
}
while(true) {
int n;
cin >> n;
if(n == 0) break;
for(int i=1; i<cnt; i++) {
if(check[n-prime[i]] == false) {
cout << n << " = " << prime[i] << " + " << n-prime[i] << "\n";
break;
}
}
}
return 0;
}
'BOJ' 카테고리의 다른 글
| [BOJ] 10974. 모든 순열 (0) | 2019.06.20 |
|---|---|
| [BOJ] 9095. 1, 2, 3 더하기 (0) | 2019.06.20 |
| [BOJ] 2609. 최대공약수와 최소공배수 (0) | 2019.06.14 |
| [BOJ] 3055. 탈출 (0) | 2019.05.01 |
| [BOJ] 2583. 영역 구하기 (0) | 2019.05.01 |