백준코딩일기
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
|
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 == 0) break; // 입력받은 수가 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;
break;
}
}
}
}
} cs
|