privatefuninput() = with(Scanner(System.`in`)) { min = nextLong() max = nextLong() }
privatefuninit() { val size = (max - min + 1).toInt() isPrime = BooleanArray(size) { false } }
privatefunsolve() { var index = 2L while(index * index <= max) { val pow = index * index val start = if (min % pow == 0L) { min / pow } else { min / pow + 1 } var i = start while (i * pow <= max) { isPrime[(i * pow - min).toInt()] = true i++ } index++ }
val result = isPrime.count { !it } println(result) }
Point of Thinking
min과 max값을 입력받은 후, 두 값의 차만큼 배열을 초기화한다.
여기서는 BooleanArray로 선언하여 이 배열의 인덱스가 제곱 ㄴㄴ 수, 값이 소수인지 아닌지 판정한다.
필요한 건 소수(prime number)이므로 index를 2부터 max까지 순회한다.
pow 값을 계산할 때는 min에 대한 예외처리를 수행해야한다.
이후 max 범위 내에서 index의 제곱에 해당하는 인덱스를 전부 true로 바꾼다. (=에라토스테네스의 체)