n๊น์ง์ ์๋ฅผ ๋ฏธ๋ฆฌ ์์ ํ๋ณ ํ ํ์ธ
1. prime ๋ฆฌ์คํธ์์ False, False, True, … ๋ฅผ ์ ์ฅํ๋ค
-> prime์ ์ธ๋ฑ์ค ์ซ์๊ฐ ์์๋ฉด True, ๊ทธ๋ ์ง ์์ผ๋ฉด False๋ฅผ ์ ์ฅํ ๊ฒ์ด๋ค
2. ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์ด์ฉํ๋ค.
2-1. i๋ 2๋ถํฐ 2n์ ์ ๊ณฑ๊ทผ๊น์ง์ ์์๋๋ก ๋ฐฐ์๋ฅผ ์ง์๋๊ฐ๊ฒ.
-> i์ ๋ฐฐ์๋ i๋ก ๋๋ ์ง๊ธฐ ๋๋ฌธ์ ์์๊ฐ ์๋๋ฏ๋ก prime[i]๋ฅผ False๋ก ๋ณ๊ฒฝ
2-2. prime[i] ๊ฐ True์ผ ๋๋ง ๋ฐฐ์๋ฅผ ์ง์ด๋ค -> False๋ ์ด๋ฏธ ๋ ์ด์ ์ ์ง์์ง ๊ฒ์ด๋ฏ๋ก ๋ฐฐ์ ๋ํ ์ด๋ฏธ False
2-3. i*i๋ถํฐ i์ฉ ๋ํ๋ฉด์ False๋ก ๋ณ๊ฒฝ. i์ 2๋ฐฐ, 3๋ฐฐ, …, n๋ฐฐ๋ ๋ ์ด์ ์ ์ด๋ฏธ ์ง์์ก์๊ฒ์ด๋ฏ๋ก i*i๋ถํฐ ์ง์๋๊ฐ๋ค
3. ์ ๋ ฅ๋ฐ์ n๋ถํฐ 2n๊น์ง prime[n+1] ~prime[2n]์ ๊ฐ์ ํ์ธํ์ฌ True์ผ ๋๋ง count++
4. count ์ถ๋ ฅ
# 4948-1.py
while True:
n = int(input())
if n == 0:
break
count = 0
prime = [False, False] + [True] * (2*n - 1)
for i in range(2, int(pow(2*n, 0.5) + 1)):
if prime[i]:
for j in range(i * i, 2*n + 1, i):
prime[j] = False
for i in range(n+1, 2*n+1):
if prime[i]:
count += 1
print(count)
๋ฐ๋ก ์ด์ ์ 1929 ๋ฌธ์ ์์ ํผ ๋ฐฉ์ ๊ทธ๋๋ก ๋ฌธ์ ๋ฅผ ํ์๋๋ฐ
์๋๊ฐ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ณ , ์๋๊ฐ ๋น ๋ฅด๋ ๋ฐฉ๋ฒ๋ ์๊ฐ์ด ์์ฒญ ๋์ด๋ฌ๋ค
ํ์ง๋ง ์คํ๋ ค ๋ฉ๋ชจ๋ฆฌ๋ ์ค์ด๋ค์๋ค๋์ .. 1929๋ฒ ๋ฌธ์ ๊ฐ ๋ฒ์๊ฐ ๋ ๋์ด์ ๊ทธ๋ฐ๊ฒ ๊ฐ๋ค
4948๋ฌธ์ ๋ prime ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฌ์ฉ ํด์ ์ค์ด๋ ๋ฏ? ๋ฒ์๋ ๊ฑฐ์ 10๋ฐฐ ์ฐจ์ด๋๋๊น
+ ์ต๋ ๋ฒ์๋งํผ ์์๋ฅผ ๋ฏธ๋ฆฌ ํ๋ณํด prime์ ์ ์ฅํ๋ฉด ์๋๊ฐ ํจ์ฌ ๋นจ๋ผ์ง๋ค!
# 4948-2.py
N = 123456 * 2 + 1
prime = [False, False] + [True] * (N - 1)
for i in range(2, int(pow(N, 0.5) + 1)):
if prime[i]:
for j in range(i * i, N + 1, i):
prime[j] = False
while True:
n = int(input())
if n == 0:
break
count = 0
for i in range(n+1, 2*n+1):
if prime[i]:
count += 1
print(count)