https://www.acmicpc.net/problem/6588
6588번: 골드바흐의 추측
각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰
www.acmicpc.net
- 1929번을 풀때 사용했던 에라토스테네스의 체를 이용해 먼저 1~1000000까지 소수를 구해놓는다.
- i=3 부터 n/2 까지( 3+17 과 17+3은 3+17를 출력), 소수인 홀수만 해당하니까 i+=2
- i가 홀수인 소수이고, n-i도 홀수인 소수일때 결과를 출력한다.
- 골드바흐의 추측은 1000000수까지 모두 성립하므로 홀수 소수의 합으로 n을 나타낼 수 없는경우는 존재하지 않아서 주석으로 표시해두었다.
시간초과가 나서 main함수 안에 아래 두줄을 추가했더니 해결되었다.
cin.tie(NULL);
ios::sync_with_stdio(0);
코드
//6588
#include <iostream>
using namespace std;
#define SIZE 1000001
int main(int argc, const char * argv[]) {
cin.tie(NULL);
ios::sync_with_stdio(0);
int num[SIZE]={0,};
int n;
for(int i=2;i<=SIZE;i++)num[i] = 1; //모두 소수로 취급
for(int i=2;i*i<=SIZE; i++){
if(num[i]){ //소수인 것만
for(int j=i*i;j<=SIZE;j+=i)num[j] = 0;
}
}
while(1)
{
cin >> n;
if(n == 0) break;
for(int i=3;i<=n/2;i+=2) //홀수만
{
if(num[i] == 0)continue;// 소수인 수만
// else if(n-i < 0) {
// cout << "Goldbach's conjecture is wrong.";
// break;
// }
else if( num[i] == 1 && num[n-i] == 1)
{
cout<< n << " = " << i << " + " << n-i << "\n";
break;
}
}
}//while
return 0;
}
'코딩테스트 연습 > Baekjoon' 카테고리의 다른 글
[Baekjoon] 9093번: 단어 뒤집기 (c++) (0) | 2022.03.31 |
---|---|
[Baekjoon] 9012번: 괄호 (c++) (0) | 2022.03.31 |
[Baekjoon] 2745번: 진법 변환 (c++) (0) | 2022.03.31 |
[Baekjoon] 2609번: 최대공약수와 최소공배수 (c++) (0) | 2022.03.31 |
[Baekjoon] 2089번: -2진수 (c++) (0) | 2022.03.31 |