문제
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의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.
풀이
에라스토테네스의 체를 이용한 문제.
이 문제를 풀면서 에라스토테네스를 사용하는 방법을 배울 수 있었다.
boolean으로 입력값인 10000개의 배열을 선언하고 소수가 아닌 수에 대하여 true로 전환해준다. 나온 수들의 배수는 소수가 아니므로 치환해준다.예를들어 2가 나오면 2의 배수를 true로 치환, 3의배수, 5의 배수등도 똑같이 처리해주면 마지막에는 소수만 남게된다.
체가 완성이 되었다면 이를 이용해서 풀면된다. 입력값이 무조건 짝수이므로 이의 중간값에서 똑같은 값을 플러스 마이너스하면 합은 처음입력값과 같으므로 이 두 수의 위치의 boolean값이 false라면 정답이 된다. ㅇㅅㅇ
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
|
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//에라스토테네스의 체
boolean [] era = new boolean[10001];
//모든 소수 =false 소수가 아닌수 =true
if(!(era[i])) {
for(int j=2;i*j<10001;j++) {
era[i*j]=true;
}
}
}
int n=Integer.parseInt(br.readLine());//test case입력받기
int cnt;
for(int i=0;i<n;i++) {
int temp =Integer.parseInt(br.readLine()); //입력값
temp/=2;
cnt=0;
while(true) {
if(!(era[temp-cnt])&& !(era[temp+cnt])) {
System.out.println((temp-cnt)+" "+(temp+cnt));
break;
}
cnt++;
}
}
}
}
|
https://www.acmicpc.net/problem/9020
'Algorithms > BOJ[Java]' 카테고리의 다른 글
[백준/1436번] 영화감독 숌 [Java] (0) | 2020.03.09 |
---|---|
[백준/2231번] 분해합(Asia Regional - Seoul 2005)[Java] (0) | 2020.03.09 |
[백준/4948번] 베르트랑 공준(2011 Japan Domestic Contest ) [Java] (0) | 2020.02.25 |
[백준/2309번] 일곱난쟁이[Java] (0) | 2020.02.19 |
[백준/10845번] 큐 [Java] (0) | 2020.02.18 |