https://www.acmicpc.net/problem/9020
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
8=3+5, 20=17+3 ... 이렇게 소수+소수=짝수를 할 수 있다는게 골드바흐의 추측이다.
반대로 생각하면 짝수에서 어느 소수를 빼면 소수가 나오는 경우가 있다는 말이다.
테스트 케이스에 대해서 소수 판별을 해야하므로 소수 리스트를 미리 구해두는게 더 좋겠다.
bool isPrime[10001];
void find(){
for(int i=2; i<=10000; i++){
isPrime[i] = true;
for(int j=2; j*j<=i; j++){
if(i%j == 0){
isPrime[i] = false;
break;
}
}
}
}
미리 참으로 설정하고 나누어 떨어지는 경우 거짓으로 만든 후 반복을 끝낸다.
#include <iostream>
bool isPrime[10001];
void find(){
for(int i=2; i<=10000; i++){
isPrime[i] = true;
for(int j=2; j*j<=i; j++){
if(i%j == 0){
isPrime[i] = false;
break;
}
}
}
}
int main(){
find();
int T, N;
scanf("%d", &T);
for(int i=0; i<T; i++){
scanf("%d", &N);
for(int j=N/2; j<=N; j++){
if(isPrime[j] && isPrime[N-j]){
printf("%d %d\n", N-j, j);
break;
}
}
}
}
매 입력이 들어올 때마다 짝수 = 소수 + 소수 판별을 해본다.
N/2부터 시작한다는 점은 최대한 j, N-j의 차이를 줄이기 위해서이다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
2226 이진수 (0) | 2022.08.29 |
---|---|
1262 알파벳 다이아몬드 (0) | 2022.08.20 |
11653 소인수분해 (0) | 2022.08.19 |
1018 체스판 다시 칠하기 (0) | 2022.08.19 |
2293 동전 1 (0) | 2022.08.17 |
댓글