에라토스테네스의 체를 사용하면 소수를 빠르게 구할 수 있습니다
에라토스테네스의 체(Sieve of Eratosthenes) 알고리즘 사용:
• sqrt를 매번 계산하는 대신, 전체 범위에서 소수를 빠르게 구할 수 있습니다.
• 이 알고리즘은 배수 제거 방식으로 소수를 효율적으로 찾습니다.
에라토스테네스의 체를 이용한 소수 찾기
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
const int MAX_N = 1000000;
vector<bool> is_prime(MAX_N + 1, true); // 초기에는 모든 수가 소수라고 가정
is_prime[0] = is_prime[1] = false; // 0과 1은 소수가 아님
// 에라토스테네스의 체로 소수 판별
for (int i = 2; i * i <= MAX_N; i++) {
if (is_prime[i]) {
for (int j = i * i; j <= MAX_N; j += i) {
is_prime[j] = false; // i의 배수는 소수가 아님
}
}
}
// 소수 출력
for (int t = 2; t <= MAX_N; t++) {
if (is_prime[t]) cout << t << ' ';
}
return 0;
}
깨달은점
for(int j = i * i ... ) 에서 왜 j 를 i * i 로 초기화 하는지 의문이였습니다.
이유는 i는 소수이기에 is_prime 으로 소수를 추가하지 않고 i 의 배수들만 소수로 저장합니다.
'C++' 카테고리의 다른 글
c++ 진수 변환 (0) | 2024.11.10 |
---|---|
c++ vector find, erase (0) | 2024.11.09 |
c++ <bits/stdc++.h> 헤더 사용하기 (윈도우 & 맥) (0) | 2024.11.07 |
c++ 문자열 추출하기 (0) | 2024.11.07 |
c++ string 값 거꾸로 뒤집기 (0) | 2024.11.01 |