백준_9020 (골드바흐의 추측)
구현방법
- 에라토스테네스의 체를 이용하여 2부터 입력받은 수 중 가장 큰 숫자까지의 소수 유무를 isPrime 배열에 저장한다.
- 입력받은 숫자(n) 에서 i(소수)를 뺀 값(j) 가 소수이면 두개의 소수 쌍을 초기화한다
- 이때, 두 소수의 차이가 최소가 되는 경우를 찾아야하므로, minDifference 변수에 최소차이값을 저장하면서 루프를 돌린다.
Code
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
55
56
package com.company.baekjoon;
import java.io.*;
import java.util.Arrays;
public class 한규호_9020 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int caseCnt = Integer.parseInt(br.readLine());
int[] numbers = new int[caseCnt];
int maxNum = 0;
for (int i = 0; i < caseCnt; i++) {
numbers[i] = Integer.parseInt(br.readLine());
if (maxNum < numbers[i]) {
maxNum = numbers[i];
}
}
boolean[] isPrime = new boolean[maxNum + 1];
Arrays.fill(isPrime, true);
for (int i = 2; i * i < maxNum; i++) {
if (isPrime[i]) {
for (int j = i * 2; j < maxNum + 1; j += i) {
isPrime[j] = false;
}
}
}
for (int number : numbers) {
printGoldbachPartition(number, isPrime);
}
bw.close();
}
static private void printGoldbachPartition(int n, boolean[] isPrime) throws IOException {
int minDifference = 9996;
int primeA = 0;
int primeB = 0;
for (int i = 2; i < n; i++) {
if (isPrime[i]) {
int j = n - i;
if (isPrime[j]) {
int difference = Math.abs(i - j);
if (minDifference > difference) {
primeA = i;
primeB = j;
minDifference = difference;
}
}
}
}
bw.write(primeA + " " + primeB + "\n");
}
}
This post is licensed under CC BY 4.0 by the author.