언어/C++

소수 구하는 알고리즘

O_oz 2024. 9. 12. 19:51
반응형

 

 

n까지의 소수 출력하기

 

- 반복문

소수를 판단하기 위해서 2부터 모든 수를 나눠보지 않아도 된다고 한다

int n;
std::cin >> n;

for (int i = 2; i <= n; i++)
{
	bool isPrime = true;
    
	for (int j = 2; j * j <= i; j++)
    {
        if (i % j == 0)		// 1이 아닌 다른 수로
        {
        	isPrime = false;
            break;
        }
    }
    
    if (isPrime)
    {
    	std::cout << i << ' ';
    }
}

std::cout << '\n';

 

 

- 에라토스테네스의 체

 

반복문보다 이게 더 빠름

 

2부터 n까지의 모든 수를 나열

2는 소수이므로 저장하고 그 외 2의 배수들은 소수가 아니므로 지움

남은 수 중 3은 소수이므로 저장하고 그 외 3의 배수들은 소수가 아니므로 지움

남은 수 중 5는 소수이므로 저장하고 그 외 5의 배수들은 소수가 아니므로 지움

위와 같은 과정을 반복

#include <vector>

std::vector<bool> sieveOfEratosthenes(int n)
{
    std::vector<bool> isPrime(n + 1, true);
    isPrime[0] = isPrime[1] = false;

    for (int i = 2; i * i <= n; i++)
    {
        if (isPrime[i])
        {
            for (int j = i * i; j <= n; j += i)
            {
                isPrime[j] = false;
            }
        }
    }
    
    return isPrime;
}

int main()
{
	std::vector<bool> primeList = sieveOfEratosthenes(120);
    
    for (int i = 2; i < primeList.size(); i++)
    {
        if (primeList[i])
        {
        	std::cout << i << ' ';
        }
    }
    std::cout << '\n';

	return 0;
}
반응형

'언어 > C++' 카테고리의 다른 글

최대공약수, 최소공배수 알고리즘  (0) 2024.09.12
c++ 자료형  (0) 2024.09.09
[MFC] 다이얼로그 2  (1) 2023.10.29
[MFC] 다이얼로그 1  (0) 2023.10.28
[C++] 클래스  (1) 2023.10.23