https://www.acmicpc.net/problem/9020
2초 / 256MB
문제
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다.
골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다.
2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다. (4 ≤ n ≤ 10,000)
출력
각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.
- 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다
- 2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력
- 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력
- 4 ≤ n ≤ 10,000
- 출력하는 소수는 작은 것부터 먼저 출력
- 공백으로 구분
풀이 (C++)
- iostream
- 에라토스테네스의 체
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
|
#include <iostream>
using namespace std;
int main() {
bool chk[10001];
bool prime[10001];
for (int i = 2; i <= 10000; i++) {
if (chk[i] == true) continue;
chk[i] = true;
prime[i] = true;
int n = 2;
while (n*i <= 10000) {
chk[n*i] = true;
n++;
}
}
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int left = n/2;
int right = n/2;
while (left >=2) {
if (prime[left]==true && prime[right]==true) break;
left--;
right++;
}
cout << left << " " << right << '\n';
}
return 0;
}
|
cs |
풀이 과정
- 6~17번 줄 // 에라토스테네스의 체 이용 (n=10000일 때 2+9998까지 확인할 수 있으므로 10000까지 확인)
- 19~21번 줄 // 테스트 케이스의 수 T입력 받은 후 반복
- 24~25번 줄 // left와 right을 구분하여 left는 항상 right보다 작은 수 ( 8=3+5에서 3이 left, 5가 right 출력하는 소수는 작은 것부터 먼저 출력해야 하기 때문 )
- 24~25번 줄 //left와 right의 시작점은 n/2로 한다( 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력해야 함 // n은 항상 짝수 )
- 26번 줄 // while(1)로 해도 가능 ( 근거는 문제에서 "10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재"라고 했기 때문 )
- 27번 줄 // left right 둘 다 소수일 경우 답을 찾은 경우 break
- 31번 줄 // 정답 출력
주의사항
- 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력
- 출력하는 소수는 작은 것부터 먼저 출력 공백으로 구분
- 4 ≤ n ≤ 10,000
'BOJ' 카테고리의 다른 글
C++) BOJ 풀이// 1725: 히스토그램, 6549: 히스토그램에서 가장 큰 직사각형 (Largest Rectangle in a Histogram) (0) | 2020.03.06 |
---|---|
C++) BOJ 풀이// 12865: 평범한 배낭 (1) | 2020.03.05 |
C++) BOJ 풀이// 3053: 택시 기하학 (HERMAN) (0) | 2020.03.05 |
C++) BOJ 풀이// 1002: 터렛 (0) | 2020.03.04 |
C++) BOJ 풀이// 4948: 베르트랑 공준 (Chebyshev's Theorem) (0) | 2020.03.04 |