티스토리 뷰

PS/BOJ C++

9020번 - 골드바흐의 추측

zpqmdh 2021. 10. 31. 06:23

https://www.acmicpc.net/problem/9020

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net

무작정 1부터 늘려가며 비교를 했는데 시간초과 오류가 떴다.

그래서 다시 생각해보니 중간값에서 멀어지는 것이 두 소수의 차이가 가장 작은 값을 찾는 더 빠른 방법일거라 생각했다. 

 

소수를 구하는 방법은 

https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

를 풀어보자!

#include <iostream>
#include <math.h>
using namespace std;
bool *primenumber;
//에라토스테네스의 체를 활용한 소수 구하기
void prime(int n)
{
  primenumber = new bool[n+1];
  fill_n(primenumber, n+1, 1);
  primenumber[0] = false; //0은 소수가 아님
  primenumber[1] = false; //1은 소수가 아님
  for(int i=2; i<=sqrt(n); i++)
  {
    if(primenumber[i] == true)
      for(int j=2*i; j<=n; j+=i)
        primenumber[j] = false;
  }
}
//골드바흐의 추측
void goldbach(int n)
{
  //짝수의 중간값에서 1씩 멀어지며 탐색하기
  for(int j=n/2; j>0; j--)
    //j + (n-j) == n
    if(primenumber[j] && primenumber[n-j])
    {
      //만족하게 된다면 그 값이 가장 차가 적은 소수의 합
      cout << j << " " <<n-j << '\n';
      return ;
    }
}
int main() {
  int T;
  cin >> T;
  int N; //4<=N<=10,000
  for(int i=0; i<T; i++)
  {
    cin >> N;
    prime(N); //소수판별
    goldbach(N); //골드바흐의 추측
  }
  return 0;
}

'PS > BOJ C++' 카테고리의 다른 글

4781번 - 사탕가게  (0) 2021.11.08
2275번 - 부녀회장이 될테야  (0) 2021.11.02
15661번 - 링크와 스타트  (0) 2021.10.31
15989번 - 1, 2, 3 더하기 4  (0) 2021.10.31
14888번 - 연산자 끼워넣기  (0) 2021.10.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함