일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 플로이드 와샬
- 조합론
- 크루스칼
- pytorch
- BFS
- 2023
- 알고리즘
- dfs
- 너비 우선 탐색
- DP
- 미래는_현재와_과거로
- object detection
- lazy propagation
- 세그먼트 트리
- 자바스크립트
- dropout
- 문자열
- 회고록
- Overfitting
- NEXT
- 가끔은_말로
- c++
- 우선 순위 큐
- 다익스트라
- 이분 탐색
- tensorflow
- 가끔은 말로
- 백트래킹
- 분할 정복
- back propagation
Archives
- Today
- Total
Doby's Lab
백준 6588번: 골드바흐의 추측 (C++) 본문
https://www.acmicpc.net/problem/6588
6588번: 골드바흐의 추측
각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰
www.acmicpc.net
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 |