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
47
48
49
|
import sys
# 무식한 방법....(당연히 런타임 에러)
# def checkSum():
# dis = 10000
# rx = 0
# ry = 0
# for x in range(N+1):
# if arr[x] == 1:
# for y in range(x, N+1):
# if arr[y] == 1:
# if x + y == N:
# dif = y - x
# if dis > dif:
# dis = dif
# rx = x
# ry = y
# return rx, ry
for T in range(int(sys.stdin.readline().rstrip())):
N = int(sys.stdin.readline().rstrip())
# 소수 찾기
arr = [0, 0] + [1]*(N-1)
rootN = int(N**0.5)
for i in range(2, rootN+1):
if arr[i] == 1:
for j in range(2*i, N+1, i):
arr[j] = 0
# 확인해야 하는 값을 줄이기 위해,
# a는 중앙에서 부터 1 방향으로 내려가고
# b는 중앙에서 N 까지 올라가며 검증
# 16을 예로 (0, 16) (1, 15) (2, 14) ...
# 정대칭된 수를 더하면 16을 만들 수 있다.
# 16 만들기로 (3, 13)을 제시할 수도 있지만,
# 16의 중심값을 기준으로 비교하는 것이 두 수의 차이를
# 더 줄일 수 있는 방법이었다.
a = N//2
b = a
while a > 0:
if arr[a] and arr[b]:
print(a, b)
break
else:
a -= 1
b += 1
|