Develop & CS/Algorithm & Data Structure

[C] 에라토스테네스의 체, 소수 구하기

2022. 4. 25. 23:15
반응형

우리에게 익숙한..

중학교 1학년 때 배우는 에라토스테네스의 체

 

이 전에(과제할 때) 반복문을 돌려서 나머지가 0인지를 판별하는 식으로 소수를 판별했는데,

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

 

1929번: 소수 구하기

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

www.acmicpc.net

이번 백준 문제를 풀고 그 방식이 너무나도 느리다는걸 깨달았습니다.

 

그래서 나온 결론은 에라토스테네스의 체를 이용하는 방법입니다.

숫자 배열로 공간을 많이 먹기는 해도 속도는 훨 빠르더군요.

 

#include<stdio.h>

int main(void)
{
    int n, m;
    int i, j;
    int che[1000001] = {0,};
    che[1] = 1;

    scanf("%d %d",&m,&n);

    for(i=2; i<=n; i++)
    {
        for(j=2; i*j<=n; j++)
        {
            che[i*j] = 1;
        }
    }

    for(i=m; i<=n; i++)
    {
        if(che[i] == 0)
        {
            printf("%d\n",i);
        }
    }

    return 0;
}

위 문제를 해결한 코드입니다.

여기서 주목할 부분은 che(체)라는 배열을 필요한 숫자만큼 만들고 모두 0으로 초기화합니다.

0이면 소수, 1이면 합성수가 될 것입니다.

 

1부터 세므로 필요한 배열에 1을 더해서 만들어주고, 1은 소수가 아니므로 그냥 1을 집어넣어 줍니다.

 

여기서 서로 곱하는 수를 반복문을 돌려서 곱해줍니다. 그래서 나온 숫자 배열에 1을 넣어줍니다. 그러면 무언가를 곱해서 나온 숫자이므로 합성수가 될 것입니다.

for(i=2; i<=n; i++)

{

   for(j=2; i*j<=n; j++)

   {

      che[i*j] = 1;

   }

}

 

이후 che[숫자]가 0이면 소수, 1이면 합성수로 판단하도록 합니다.

 

이렇게 해서 시간을 절약할 수 있었습니다. 감사합니다.

반응형
'Develop & CS/Algorithm & Data Structure' 카테고리의 다른 글
  • [C 언어] 유클리드 호제법 증명과 재귀함수 구현
  • [C 언어] 두 번째로 큰(작은) 수를 구하기
  • 퀵 정렬(Quick Sort) C 언어
  • [Programming] 최소 신장 트리 알고리즘 정리
그믐​
그믐​
그믐​
neutrinox4b1
그믐​
전체
오늘
어제
  • 분류 전체보기 (288)
    • Write up (Wargame) (121)
      • Pwnable (60)
      • Reversing (0)
      • Web Hacking (8)
      • Forensic (1)
      • Cryptography (6)
      • LOB (10)
      • misc (0)
      • SF pwnable 기초 (10)
      • SF pwnable 심화 (1)
      • LOS (25)
    • Security (73)
      • 시스템 해킹(PWN, System) (21)
      • 리버싱(Reverse Engineering) (1)
      • 포렌식(Forensic) (3)
      • 암호학(Cryptography) (44)
      • 네트워크(Network) (1)
      • 임베디드(Emebedded) (0)
    • Develop & CS (38)
      • Algorithm & Data Structure (6)
      • Baekjoon (11)
      • C, C++ (8)
      • Python (2)
      • R (1)
      • etc (8)
    • 프로젝트(Project) (7)
      • 시간표&급식 파싱 (1)
      • 남방진동지수 (1)
      • 네트워크 해킹 (5)
    • Daily life (44)
      • My Book (10)
      • Book Review (1)
      • IT Review (1)
      • 일상 팁 (19)
      • 네트워크관리사 (2)
      • 근황 (11)
    • 수학&과학(Mathematics & Science.. (4)

인기 글

공지사항

  • Wargame, CTF별 검색 키워드 정리
hELLO · Designed By 정상우.
그믐​
[C] 에라토스테네스의 체, 소수 구하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.