소수를 미리 구해서 배열을 만든 뒤
가장 두 소수의 차가 적은 짝수 n을 만드는 소수 두 개의 조합을 찾아야 한다.
n/2에서 i를 더하거나 뺀 값이다.ns 배열에서 소수일 경우 0, 소수가 아닌 경우 1로 이미 배열을 완성했기 때문에ns[i] || ns[n-i] 두 수 모두가 소수로 0일 때 (False) 반복문을 빠져나오면 소수 i와 n-i를 쉽게 찾을 수 있다.
| 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
| 2 | 3 | 3 | 5 | 5 | 7 | 5 | 7 | 7 | 11 |
| n/2 | n/2 | n/2-1 | n/2 | n/2-1 | n/2 | n/2-3 | n/2-2 | n/2-3 | n/2 |
| 2 | 3 | 5 | 5 | 7 | 7 | 11 | 11 | 13 | 11 |
| n/2 | n/2 | n/2+1 | n/2 | n/2+1 | n/2 | n/2+3 | n/2+2 | n/2+3 | n/2 |
#include <stdio.h>
#define MAX 5100
int main()
{
int T, n, i, j;
char ns[MAX+1] = {1,1};
for (i = 2; i * i < MAX + 1; i++)
if (!ns[i])
for (j = i * i; j < MAX + 1; j += i)
ns[j] = 1;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for (i = n / 2; ns[i] || ns[n-i]; i++);
printf("%d %d\n", n - i, i);
}
return 0;
}'문제풀이' 카테고리의 다른 글
| [C언어] 백준 4153번 직각삼각형 (0) | 2022.01.09 |
|---|---|
| [C언어] 1085번 직사각형에서 탈출 (0) | 2022.01.06 |
| [C언어] 백준 4948번 베르트랑 공준 (0) | 2022.01.05 |
| [C언어] 백준 1929번 소수구하기 (0) | 2022.01.04 |
| [C언어] 백준 11653번 소인수분해 (0) | 2022.01.04 |