백준코딩일기

6588) 골드바흐의 추측

nari___ 2020. 1. 29. 19:43

문제 )

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

 

풀이 )

에라토스테네스의 체를 완벽히 이해하고 접근하니 쉽게 풀 수 있었다.

소수는 2를 포함하지만 골드바흐의 추측문제는 소수중에서도 홀수만 사용하므로 2를 빼주었다.

 

 

코드 )

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
import java.io.*;
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        boolean[] primeNum = new boolean[1000001];
        
        // 2부터 100,000까지 모든 수에 true값을 넣음
        for(int i=3; i<1000001; i++) primeNum[i] = true;
        
        for(int i=2; i<1000001; i++) { // 2부터 100,000까지 전부 돌면서 검사
            for(int j=2; i*j<1000001; j++) { // 소수가 아닌 수를 모두 false로 바꾸는 작업
                
                // 이미 검사가 되어 false 값이 들어갔다면 넘어감
                if!primeNum[i*j]) continue;
                
                // 아직 검사가 안된값이라면 false 값을 넣음
                // ex). i=2, j=2 이면 i*j=4 의값이 false가 됨
                primeNum[i*j] = false;
            }
        }
        
 
        int n = 1;        // 입력받는 수
        while( n != 0) {
            n = Integer.parseInt(br.readLine());
            
            if( n == 0break;    // 입력받은 수가 0이면 종료
            
            int a=0, b=0;
            for(int i=3; i<1000001; i++) {    // 소수중에서도 홀수만 확인하므로 i=3부터 시작
                
                // a 와 b가 모두 소수인지 확인 후에 출력
                if( primeNum[i] == true && primeNum[n-i] == true) {
                    a = i;
                    b = n-i;
                    bw.write(n + " = " + a + " + " + b + "\n");
                    break;
                }
            }
        }
    }
} cs