728x90
정의
수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다.
에라토스테네스 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 에라토스테네스(Ερατοσθένης, 기원전 274년 ~ 기원전 196년)는 고대 그리스의 수학자이자 천문학자이다. 헬레니즘 시대 이집트에서 활약했으며, 문헌학 및
ko.wikipedia.org
알고리즘
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다.
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다.
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다.
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
코드
import java.io.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val number = br.readLine().toInt()
// 입력으로 들어온 수까지 모든 수를 소수라고 초기화 한다.
val prime = BooleanArray(number + 1) { true }
// 입력된 수의 제곱근을 구한다.
val sqrt = Math.sqrt(number.toDouble()).toInt()
println("sqrt : $sqrt")
// 2부터 제곱근 까지 탐색한다.
for (i in 2..sqrt) {
// 소수가 아니므로 다음 탐색을 한다.
if (!prime[i]) continue
var j = 2
while (i * j <= number) {
if (prime[i * j]) prime[i * j] = false
j++
}
}
println("===== Result =====")
for (i in 2..number) {
if (prime[i]) print("$i ")
}
println()
}
728x90
'알고리즘(w.KOTLIN)' 카테고리의 다른 글
[알고리즘] 가장 긴 증가하는 부분 수열 구하기 (0) | 2023.05.09 |
---|---|
[알고리즘][KOTLIN] 선택 정렬 (0) | 2022.11.18 |
[알고리즘] 버블 정렬 (0) | 2022.11.11 |
[BOJ][2563] 색종이 (0) | 2022.10.25 |
[BOJ][5597] 과제 안 내신 분..? (0) | 2022.10.25 |