백준 6588번 골드바흐의 추측
< 백준 6588번 골드바흐의 추측 - 마포 코딩박 >
사용한 알고리즘: 에라토스테네스의 체
문제에서 어떤 짝수 n 이 주어집니다. 두개의 홀수인 소수의 합으로 n 을 만들 수 있는지 묻는 문제였습니다.
문제풀이는 다음과 같습니다.
(1) (코드 9~20)
에라토스테네스의 체로 10^6 까지의 소수를 구합니다. ( n의 최대가 10^6)
(2) (코드 26~38)
입력된 어떤 수 num에 과정(1) 에서 구해놓은 소수를 빼 보며, 뺀 결과가 홀수인 소수인 경우 이를 출력합니다. ( 단 홀수인 소수는 2보다 큰 수 입니다. )
사용한 알고리즘: 에라토스테네스의 체
문제에서 어떤 짝수 n 이 주어집니다. 두개의 홀수인 소수의 합으로 n 을 만들 수 있는지 묻는 문제였습니다.
문제풀이는 다음과 같습니다.
(1) (코드 9~20)
에라토스테네스의 체로 10^6 까지의 소수를 구합니다. ( n의 최대가 10^6)
(2) (코드 26~38)
입력된 어떤 수 num에 과정(1) 에서 구해놓은 소수를 빼 보며, 뺀 결과가 홀수인 소수인 경우 이를 출력합니다. ( 단 홀수인 소수는 2보다 큰 수 입니다. )
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
using namespace std; | |
int num; | |
bool visited[1000000]; | |
vector<int> Prime; | |
bool flag; | |
// 10^6 까지의 모든 소수를 구한다. | |
void MakePrime(){ | |
for (int i = 2; i <= 1000000; ++i){ | |
if(visited[i]) continue; | |
Prime.push_back(i); | |
int temp = i; | |
while(temp+i<1000000){ | |
temp += i; | |
visited[temp] = true; | |
} | |
} | |
} | |
int main(){ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); | |
MakePrime(); | |
while(1){ | |
cin >> num; | |
if(num == 0) break; | |
// 답이 있는지 체크 | |
flag = false; | |
for (int i = 0; i < Prime.size(); ++i){ | |
// num - 어떤소수 = 소수 인 경우 , 이는 2보다 큰 수여야 한다. | |
if(!visited[num-Prime[i]] && num-Prime[i]>2){ | |
cout << num << " = " << Prime[i] << " + " << num-Prime[i] << '\n'; | |
flag = true; | |
break; | |
} | |
} | |
// 답이 없는경우 | |
if(!flag) | |
cout << "Goldbach's conjecture is wrong." << '\n'; | |
} | |
return 0; | |
} |
댓글
댓글 쓰기
긴 글 읽어주셔서 감사합니다.
궁금한게 있으시다면 댓글 달아주세요!