일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dfs
- Overfitting
- DP
- 가끔은 말로
- 이분 탐색
- 플로이드 와샬
- NEXT
- pytorch
- 분할 정복
- 다익스트라
- back propagation
- 조합론
- 회고록
- lazy propagation
- 미래는_현재와_과거로
- 자바스크립트
- 세그먼트 트리
- 2023
- dropout
- c++
- BFS
- 너비 우선 탐색
- object detection
- 가끔은_말로
- 우선 순위 큐
- 백트래킹
- 크루스칼
- 알고리즘
- 문자열
- tensorflow
Archives
- Today
- Total
Doby's Lab
백준 6588번: 골드바흐의 추측 (C++) 본문
https://www.acmicpc.net/problem/6588
Solved By: Sieve of Eratosthenes
Sieve of Eratosthenes를 사용하되 체크하는 부분을 sqrt(MAX)까지만 해도 되는 것을 알고서 구현을 해줍니다.
그리고, 방문 배열을 사용하지 않는 코드를 짜서 문제를 풀어봅니다.
왜냐하면 Sieve of Eratosthenes에서 사용했던 num 배열을 다시 한 번 사용하여 n에서 어떤 소수를 뺀 값이 소수인지 판별할 수 있기 때문입니다.
#include <iostream>
#include <vector>
#include <cmath>
#define MAX 1000001
using namespace std;
vector<int> prime;
int num[MAX];
void getPrime(){
for(int i = 2; i < MAX; i++) num[i] = i;
for(int i = 2; i < sqrt(MAX); i++){
if(num[i] != 0){
for(int j = i + i; j < MAX; j += i){
num[j] = 0;
}
}
}
for(int i = 3; i < MAX; i++){
if(num[i]) prime.push_back(i);
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
getPrime();
while(true){
cin >> n;
if(n == 0) break;
bool flag = false;
for(auto v : prime){
if(num[n - v] != 0){
flag = 1;
cout << n << " = " << v << " + " << n - v << '\n';
break;
}
}
if(!flag) cout << "Goldbach's conjecture is wrong." << '\n';
}
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 15312번: 이름 궁합 (C++) (0) | 2022.08.04 |
---|---|
백준 19577번: 수학은 재밌어 (C++) (0) | 2022.08.04 |
백준 13926번: gcd(n, k) = 1 (C++) (0) | 2022.08.03 |
백준 10854번: Divisions (C++) (0) | 2022.08.01 |
백준 4149번: 큰 수 소인수분해 (C++) (0) | 2022.08.01 |