백준/백준-C++

9020번: 골드바흐의 추측

Beabletoet 2017. 5. 28. 13:06

#include<cstdio>

#define max 20000

int main()

{

int t, n, up, down;

scanf("%d", &t);

bool num[max+1];

for (int i = 0; i <= max; ++i)

num[i] = 1;

for (int i = 4; i <= max; i += 2)

num[i] = 0;

for (int i = 3; i*i <= max; i += 2)

if (num[i] == 1)

for (int j = i*i; j <= max; j += 2 * i)

num[j] = 0;

while (t--)

{

scanf("%d", &n);

up = down = n / 2;

while (up > 1 && down < 20001)

if (num[up] == 1 && num[down] == 1 && up + down == n)

break;

else if (up + down >= n)

for (--down; num[down] != 1; --down);

else

for (++up; num[up] != 1; ++up);

printf("%d %d\n", down, up);

}

}


===============위에는 down변수 사용. 그렇게 할 경우 범위가 커지는 다른 문제에서 시간 초과이기에 아래와같이 바꿔주면 좀 더 범용적임.


#include<cstdio>

#define max 20000

int main()

{

int t, n, up;

scanf("%d", &t);

bool num[max + 1];

for (int i = 0; i <= max; ++i)

num[i] = 1;

for (int i = 4; i <= max; i += 2)

num[i] = 0;

for (int i = 3; i*i <= max; i += 2)

if (num[i] == 1)

for (int j = i*i; j <= max; j += 2 * i)

num[j] = 0;

while (t--)

{

scanf("%d", &n);

up = n / 2;

while (up <= n)

if (num[up] == 1 && num[n - up] == 1)

break;

else

for (++up; num[up] != 1; ++up);

printf("%d %d\n", n - up, up);

}

}