문제 출처
1. 문제설명
- 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다.
- 백만 이하의 모든 짝수에 대해서, 이 추측을 검증하라
2. 알고리즘 설계
- 소수 이므로, 소수를 구하는 알고리즘을 취한다.
- 에라토스테네스의 체 사용
- 3부터 범위
N
까지 돌면서, 가장 앞의 소수와 가장 뒤의 소수가 정답
3. 로직
bool chk[SZ + 1];
void eratos(void)
{
chk[1] = true;
for (int i = 2; i <= sqrt(SZ); i++) {
if (chk[i]) continue;
for (int j = i * i; j <= SZ; j += i)
chk[j] = true;
}
}
4. 전체 코드
#include<bits/stdc++.h>
using namespace std;
const int SZ = 1000000;
bool chk[SZ + 1];
void eratos(void)
{
chk[1] = true;
for (int i = 2; i <= sqrt(SZ); i++) {
if (chk[i]) continue;
for (int j = i * i; j <= SZ; j += i)
chk[j] = true;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
eratos();
while (true) {
int n; cin >> n;
if (n == 0) break;
bool flag = false;
for (int i = 3; i <= n; i += 2) {
if (!chk[i] && !chk[n - i]) {
cout << n << " = " << i << " + " << n - i;
flag = true;
break;
}
}
if (!flag) cout << "Goldbach's conjecture is wrong.";
cout << '\n';
}
}
5. 소감
- 이 문제처럼 테스트케이스로 되어 있는 경우는
- 최대 범위까지 한번에 구해놓는 게 편한 거 같다.