완전탐색 하지 않고 빠르고 정확하게 소수를 구하는 알고리즘
bool visit[MAX]
-> 2부터 시작하여 소수를 구하고, 소수의 배수를 모두 true 처리를 한다.
-> visit[i]가 0인 인덱스들이 소수이다.
4,000,000까지 수 중 소수의 개수는 대략 28만 개가 넘는다. 범위에 조심하자!
void sieveOfEratosthenes(){
for(int i=2;i<=sqrt(N);i++){
if(visit[i]==1) continue;
for(int j=i+i;j<=N;j+=i){
visit[j]=1;
}
}
for(int i=2;i<=N;i++){
if(visit[i]==false) {
prime.push_back(i);
}
}
}
prime=[True]*10000000
def primeChae(n):
N=10**n
prime[0]=prime[1]=False
for i in range(2,int(math.sqrt(N))+1):
if prime[i]==0: continue
for j in range(i+i,N,i):
prime[j]=False
시간복잡도 : O(n log(logn))
관련 문제
'컴퓨터공학 > 수학' 카테고리의 다른 글
[알고리즘] 분할정복으로 거듭제곱 최적화하기 (0) | 2023.05.30 |
---|---|
[정수론] 모듈러 연산과 증명 (0) | 2023.05.29 |
[기하] 다각형 넓이 구하는 공식 (0) | 2023.05.28 |
[정수론] 페르마의 소정리 (모듈러 연산) (0) | 2023.05.26 |
[정수론] 효율적으로 모든 약수를 구하기 (C++) (2) | 2023.03.11 |