반응형

소수를 구하는데 고대의 그리스 수학자 에라스토스테네스에 의하여 개발된 에라스토스테네스의 체(Sieve of Erastosthenes)라는 알고리즘이 있다. 이 알고리즘은 정해진 범위 안의 소수를 찾아주는 비교적 간단한 방법이다. 이 알고리즘은 정해진 범위만큼의 배열을 생성한다. 만약 sieve[i]의 값이 0이면 i는 소수라는 의미이고 sieve[i]가 1이면 소수가 아니다. 처음에는 모든 배열의 값이 0으로 초기화된다. 즉 처음에는 모든 정수가 소수라고 가정한다. 알고리즘은 가장 작은 소수인 i=2부터 시작한다. 상식적으로 2의 배수는 소수가 아닌 것이 확실하다. 정해진 범위 안에서 2의 배수를 모두 찾아서 sieve[] 값을 1로 만든다. 즉 2, 4, 6, 8, ... 등의 인덱스를 갖는 원소들은 모두 1로 설정된다. 다음에 i를 3으로 하나 증가시킨다. 다시 3의 배수(3, 6, 9, ...)를 찾아서 sieve[i]를 1로 만든다. i를 다시 하나 증가시키면 sieve[4]는 이미 1이므로 다음 i 값으로 넘어간다. sieve[i]가 0인 다음 i를 찾아서 i의 배수를 모두 1로 만든다. 정해진 범위에 대하여 이와 같은 절차를 완료한 후에도 0값을 가지는 원소는 소수가 된다. 이 알고리즘을 이용하여 2부터 100사이의 소수를 찾아보라.

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4


SIZE 상수의 값을 변환시키면 더 큰 범위까지의 소수를 구할 수 있다.

문제에서의 sieve[]가 a[]이다. i는 나누는 수, j는 나눠지는 수, k는 소수 아닌 것들을 거를 때 곱해주는 수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#define SIZE 100
int main(void)
{
    int a[SIZE+1]={0};
    int i,j,k;
    a[0]=1;a[1]=1;
        for(i=2;i<SIZE+1;i++)
            {if(a[i]==1)
                continue;
            for(j=2;j<SIZE+1;j++)
                {if(j%i==0)
                    {for(k=2;j*k<SIZE+1;k++)
                    a[j*k]=1;}}}
        for(i=0;i<SIZE+1;i++)
            if(a[i]==0)
                printf("%d ", i);
        printf("\n");
        return 0;
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

정수의 합과 차  (0) 2016.08.15
바이트 순서 알아보기  (0) 2016.08.14
술에 취한 딱정벌레  (2) 2016.08.13
2진수 변환기  (0) 2016.08.12
2차원 행렬  (0) 2016.08.12
반응형

2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하라. 정수가 소수가 되려면 1과 자기 자신만을 약수로 가져야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main(void)
{
int a, b, c; //a는 나눠지는수 b는 나누는수
 
for(a=2;a<=100;a++)
{
    c=0// c는 약수 개수 카운터
for(b=1;b<=a;b++)
{
if(a%b==0
    c++;
}
if(c==2)
    printf("%d ", a);
}
return 0;
}
cs




반응형

+ Recent posts