[C++/백준 4948번] 베르트랑 공준

2024. 1. 28. 11:20·프로그래밍 공부/백준 (C++)

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

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net

 

해결 방법

  소수 판별법으로 N에서 2N까지의 범위의 수를 전부 소수 판별을 하면 시간 초과가 일어난다. 

에라토스테네스의 체를 이용해서 미리 선언되어있는 배열에 소수들을 판별해 놓아서 소수의 개수만 세주면 해결된다.

 

에라토스테네스의 체를 이용하는 방법은

루트 N < N 범위까지만의 본인을 제외한 배수들을 전부 지워주는 것이다.

 

2를 제외한 2의 배수 삭제
3을 제외한 3의 배수 삭제

4는 2에서 지워졌으므로 생략

5를 제외한

.

.

.

 

N이 100이라면 10의 배수까지 지워주게 되고, 11 > 루트 100 이므로 중단한다.

 

 

시행 착오

  범위가 N부터 2N (1 <= N <= 123456) 이라는 사실을 망각해 배열의 크기를 123456으로 선언했다가 segmentation error 를 띄웠다. 배열의 크기를 두배 해 주니 문제없이 작동했다.

 

 

소스 코드

#include <iostream>
#include <algorithm>
using namespace std;

int arr[246913];

bool IsPrime(long long input)
{
   long long num = input;

    if(num <= 1) return false;
    if(num == 2 || num == 3) return true;
    if(num % 2== 0 || num % 3 == 0) return false;

    for(long long i = 5; i * i <= num ;i++)
    {
        if(num % i == 0) return false;
    }

    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
  
    long long N;

    
    for(int i = 1 ; i < 246913 ; i++)
    {
        arr[i-1] = i;
    }


    arr[0] = 0;
  
    for(int j = 2; j * j < 246913 ; j++)
    {
        for(int i = 1 ; i < 246913 ; i++)
        {
            if(arr[i] == 0) continue;

            if(arr[i] % j == 0 && (i+1 != j)) arr[i] = 0; 
        }
    }

    while(1)
    {
        cin >> N;  
        if( N == 0) break;

        int cnt = 0;
        for(int i = N+1 ; i <= N*2 ; i++)
        {
            if(arr[i-1] != 0) cnt++;
        }

        cout << cnt << '\n';
    }

    return 0;
}

 

 

 

 

'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글

[C++/백준 9093번] 괄호  (0) 2024.10.11
[C++/백준 9093번] 단어 뒤집기  (0) 2024.10.11
[C++/백준 4134번] 다음 소수  (0) 2024.01.27
[C++/백준 2485번] 가로수  (0) 2023.08.25
[C++/ 백준 1735번] 분수 합  (0) 2023.08.25
'프로그래밍 공부/백준 (C++)' 카테고리의 다른 글
  • [C++/백준 9093번] 괄호
  • [C++/백준 9093번] 단어 뒤집기
  • [C++/백준 4134번] 다음 소수
  • [C++/백준 2485번] 가로수
Rocketbabydolls
Rocketbabydolls
Rocketbabydolls
  • Rocketbabydolls
    With The Lights Out
    Rocketbabydolls
  • 전체
    오늘
    어제
    • 전체글 (183) N
      • 프로그래밍 공부 (117)
        • C (16)
        • Jumping into C++ (9)
        • MFC (C++) (1)
        • 자료구조 (1)
        • 알고리즘 (1)
        • 백준 (C++) (74)
        • 핸즈온 머신러닝 2판 (6)
        • Unseen 3기 준비 (4)
        • 원티드 포텐업 게임 개발자 양성과정 2기 (4)
      • 언리얼엔진5 (62) N
        • [Part1] 이득우의 언리얼 프로그래밍 (12)
        • [Part2] 이득우의 언리얼 프로그래밍 (2)
        • [Part2 복습] 이득우의 언리얼 프로그래밍 (3)
        • [Part3] 이득우의 언리얼 프로그래밍 (14)
        • [Part4] 이득우의 언리얼 프로그래밍 (0)
        • FPS 게임 1인 프로젝트 (6)
        • 각종 지식 (10) N
        • 블루프린트 Paper2D 로 게임 만들기 (14)
        • 팀 프로젝트 (1)
      • 일상 (1)
      • ETC (1)
        • 맥북 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      언리얼엔진5
      언리얼엔진 디자인 패턴
      c++ 17298
      언리얼엔진5 fps 프로젝트
      언리얼엔진
      실전C프로그래밍
      티스토리챌린지
      핸즈온 머신러닝 2판
      언리얼엔진 중재자 패턴
      실전 C프로그래밍 실습문제
      C언어 실습문제
      실전 C 프로그래밍
      언리얼엔진 옵저버 패턴
      실전 C프로그래밍
      실전C프로그래밍 실습문제
      c언어
      오블완
      핸즈온 머신러닝
      실전 C프로그래밍 나중채
      실전C프로그래밍 나중채
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    Rocketbabydolls
    [C++/백준 4948번] 베르트랑 공준
    상단으로

    티스토리툴바