문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

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

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

 

두 가지 방법으로 풀어보았다.

 

첫 번째는 

https://kplee.tistory.com/58

 

백준 문제 번호 : 1978 - 소수찾기

문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 입력 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하��

kplee.tistory.com

여기서 푼 방법을 이용하여 알고리즘을 작성함.

 

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
31
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int[] arrNum = Console.ReadLine().Split().Select(a => int.Parse(a)).ToArray();
        
        bool bSosu = true;
        for(int i = arrNum[0]; i <= arrNum[1]; i++)
        {
            bSosu = true;
            int j = 2;
            do
            {
                if((i==1 || i % j == 0&& i != j)
                {
                    bSosu = false;
                    break;
                }
                j++;
            }
            while(j <= Math.Sqrt(i));
            if(bSosu)
            {
                Console.WriteLine(i);
            }
        }
    }
}
cs

위의 방법을 사용했을때 메모리와 시간이다.

 

두 번째는 에라토스테네스의 체를 이용한 방식이다.

문제 하단에 알고리즘 분류에 에라토스테네스의 체가 적혀있어서 관련 내용을 찾아보고 그 방식을 이용하여 알고리즘을 작성함.

 

에라토스테네스의 체가 어떤건지는 구글에 검색하면 자세히 나온다.

 

 

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
31
using System;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        int[] arrNum = Console.ReadLine().Split().Select(a => int.Parse(a)).ToArray();
        bool[] bSosu = Enumerable.Repeat(true, arrNum[1+ 1).ToArray();
        bSosu[1= false;
        
        for(int i = 2; i <= Math.Sqrt(arrNum[1]); i++)
        {
            if(bSosu[i])
            {
                for(int j = i*i; j <= arrNum[1]; j += i)
                {
                    bSosu[j] = false;
                }
            }
        }
        
        for(int i = arrNum[0]; i <= arrNum[1]; i++)
        {
            if(bSosu[i])
            {
                Console.WriteLine(i);
            }
        }
    }
}
cs

두 번째 방법을 사용했을때 사용되는 메모리와 시간이다. bool 배열 때문에 메모리의 사용량은 더 많지만 시간은 더 적게 걸린다.

+ Recent posts