#문제
#작성 코드
#include <iostream>
#include <stdio.h>
using namespace std;
bool primeArr[10001];
// 어떤 수가 소수인지 아닌지 표시해 둔 배열(1: 소수)
int primeNums[10001];
// 인덱스 0부터 소수들이 오름차순으로 들어있다.
void findPrime(){
// 에라토스테네스의 체 알고리즘 이용
// n이 최대로 가능한 10,000까지의 수에 대해 소수 구하기
fill_n(primeArr, 10001, 1);
primeArr[0]=0;
primeArr[1]=0;
for(int i=2; i*i<10001; i++){
if(primeArr[i]==0){
continue;
}
for(int j=i+i; j<10001; j+=i){
primeArr[j]=0;
}
}
}
int checkPrime(){
// 2이상의 소수들을 인덱스 0~cnt-1까지 오름차순으로 저장한다.
fill_n(primeNums, 10001, 0);
int cnt=0;
for(int i=2; i<10001; i++){
if(primeArr[i]==1){
primeNums[cnt++] = i;
}
}
return cnt;
}
int main()
{
int T, n;
scanf("%d", &T);
findPrime();
int cnt = checkPrime();
while(T--){
scanf("%d", &n);
if( n%2 != 0) return 0; // 입력받은 n이 짝수가 아니면 종료.
int minus=10000, mini=0, minj=0;
for(int i=0; i<cnt; i++){
int x = n-primeNums[i];
// x는 언제나 primeNums[i]보다 같거나 커야한다.(10은 5+5 케이스를 고려.)
if(primeArr[x]== 1 && x>=primeNums[i]){
// 두 소수의 차가 가장 작은 케이스를 출력해야한다.
if( minus > x-primeNums[i]){
minus = x-primeNums[i];
mini=primeNums[i];
minj=x;
}
}
}
printf("%d %d\n", mini, minj);
}
return 0;
}
##
'BOJ' 카테고리의 다른 글
BOJ 3009번 :: 네번째 점 (0) | 2019.11.19 |
---|---|
BOJ 1085번 :: 직사각형에서 탈출 (0) | 2019.11.19 |
BOJ 4948번 :: Chebyshev's Theorem(베르트랑 공준) (0) | 2019.11.19 |
BOJ 1929번 :: 소수 구하기 (0) | 2019.11.18 |
BOJ 2581번 :: 소수 (0) | 2019.11.18 |