소수(Prime Number)란 1과 자기 자신으로만 나누어지는 수를 의미 → 약수가 2개
합성수(Composite Number)란 약수의 개수가 3개 이상인 수
단, 1은 소수도 아니고 합성수도 아님
의 약수의 개수를 세는 방법
동작 순서
2부터 까지 모든 정수를 적는다.
아직 지우지 않은 소수 중 가장 작은 소수를 찾는다. 이 수를 라고 한다.
아직 지우지 않은 수들 중, 의 배수를 크기 순서대로 지운다.
아직 모든 수를 지우지 않았다면, 다시 2번 단계로 간다.
for (int i = 2; i <= N; ++i) {
// 아직 지우지 않은 수 중 가장 작은 소수를 찾음
if (is_prime[i]) {
for (int j = i * 2; j <= N; j += i) {
// j가 소수가 아님을 is_prime 배열에 체크
if (is_prime[j]) {
is_prime[j] = false;
}
}
}
}
for i in range(2, N+1):
# 아직 지우지 않은 수 중 가장 작은 소수를 찾음
if is_prime[i]:
for j in range(i*2, N+1, i):
# j가 소수가 아님을 is_prime 배열에 체크
if is_prime[j]:
is_prime[j] = False
bool 자료형 배열인 is_prime 안의 모든 요소들에 대하여, 처음에 True로 초기화
1은 소수가 아니므로, i값은 2부터 시작
j는 i만큼 계속 커지도록 하여, i를 제외한 N이하의 모든 i의 배수를 빠르게 체크
이후, is_prime[i] = True인 모든 i의 값은 소수가 됨