1. νλμ μ«μμ λν μμ νλ³
(1) λ°©λ²
νλ³ν΄μΌν μ«μλ₯Ό Nμ΄λΌκ³ νλ©΄ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ Nμ΄ μμμΈμ§ μ¬λΆλ₯Ό νλ³ν μ μλ€.
int N = Integer.parseInt(br.readLine());
for(int i = 2; i<= Math.sqrt(N); i++){
if(N%i == 0) System.out.println("μμκ° μλλλ€.");
return;
}
// 2μ΄μ √Nμ΄νμ λͺ¨λ μμ λν΄μ λλμ΄ λ¨μ΄μ§μ§ μμλ€λ©΄,
System.out.println("μμ μ
λλ€.");
(2) μ √NκΉμ§λ§ νμΈνλ©΄ λλμ?
μλ₯Ό λ€μ΄μ μ€λͺ ν΄λ³΄κ² λ€. N == 64λΌλ©΄,
√Nμ 8μ΄λ€.
ab = 64λΌλ©΄ √N μ 8*8 μ²λΌ aμ bκ° κ°μ μμ΄λ€.
λ§μ½ a < 8μ΄ λλ€λ©΄, bλ κ³±ν κ²°κ³Όκ° 64κ° λκΈ° μν΄μ aκ° μ€μ΄λ λ§νΌ λ°°λ‘ μ»€μ ΈμΌ νλ€.
λ°λΌμ a < √N μ΄ λλ©΄ λ°μλμ μΌλ‘ b > √N μ΄ λλ€.
λ°λΌμ λ§μ½μ νΉμ μ Nμ λνμ¬ 2 ~ √NκΉμ§μ μ μ€μ λλμ΄ λ¨μ΄μ§λ μκ° μλ€λ©΄, √Nλ³΄λ€ ν° μ μ€μμλ λλμμ λ, λλμ΄ λ¨μ΄μ§λ μ«μκ° μλ€λ λ§μ΄λ€.
μλνλ©΄ 2 ~ √Nμ μ μ€ Nμ λλμμ λ, λλμ΄ λ¨μ΄μ§λ aλ μκ° μλ€λ©΄, κ·Έ ννΈλμΈ bλ 무쑰건 √Nλ³΄λ€ μ»€μΌνκΈ° λλ¬Έμ΄λ€. λ°λλ‘ √N ~ N-1 μ€μ Nμ λλμμ λ, λλμ΄ λ¨μ΄μ§λ μ«μκ° μλ€λ©΄, κ·Έ ννΈλλ 무쑰건 2 ~ √N-1 μμ μμ΄μΌ νλ€. νμ§λ§ 2 ~ √N-1 μ€μ λλμ΄ λ¨μ΄μ§λ μ«μκ° μμΌλ―λ‘ μλμ μΌλ‘ κ·Έ λ°λνΈμλ λλμ΄ λ¨μ΄μ§λ μκ° μλ€. (ννΈλ κ΄κ³κ° μΆ©μ‘±λμ§ μκΈ° λλ¬Έμ΄λ€.)
2. νΉμ λ²μ λ΄μ μ«μλ€ μμ νλ³ - 'μλΌν μ€ν λ€μ€μ 체' μ΄μ©
(1) λ°©λ²
ν΄λΉ λ°©λ²μ
- νΉμ μ«μλ€μ ꡬκ°μ λ°°μ΄λ‘ λνλ΄κ³ ,
- λ°°μ΄ λ΄μ μμκ° μλ μ«μλ€μ μ§μμ
- μ§μ§ μμλ§ λ¨κΈ°λ
λ°©μμ μμ νλ³λ²μ΄λ€.
κ²λ³΄κΈ°μλ μκ°μ΄ O(N√N) μ λ λ€ κ² κ°μ§λ§, μλΌν μ€ν
λ€μ€μ 체λ₯Ό μ΄μ©νλ©΄ μκ°λ³΅μ‘λλ O(NloglogN)μΌλ‘ μλμ μΌλ‘ μ€μ΄λ λ€.
μλΌν μ€ν λ€μ€μ 체 λ°©λ²μ λ€μκ³Ό κ°λ€.
μΆμ²: μν€νΌλμ
- μμλ
true
, μμκ° μλ μλfalse
λΌκ³ ν΄λ³΄μ. (λ°°μ΄μdefalut
κ°μtrue
)2
λ₯Ό μ‘°ννμ λ,true
λΌκ³ λμ¨λ€. λ°λΌμ 2λ μμμ΄λ€. 2μ λ°°μλ μμκ° μλλ―λ‘ λͺ¨λfalse
λ‘ λ°κΎΌλ€.3
λ₯Ό μ‘°ννμ λ,true
λΌκ³ λμ¨λ€. λ°λΌμ 3μ μμμ΄λ€. 3μ λ°°μλ μμκ° μλλ―λ‘ λͺ¨λfalse
λ‘ λ°κΎΌλ€.4
λ 2μ λ°°μλ‘ μ΄λ―Έfalse
μ²λ¦¬κ° λμκΈ° λλ¬Έμ λμ΄κ°λ€.5
λ μ‘°ννμ λ,true
λΌκ³ λμ¨λ€. λ°λΌμ 5μ μμμ΄λ€. 5μ λ°°μλ μμκ° μλλ―λ‘ λͺ¨λfalse
λ‘ λ°κΎΌλ€.
λ§μ½ μ£Όμ΄μ§ ꡬκ°μ΄ 0 ~ 120κΉμ§μ΄λ©΄, 11*11 = 121μ΄λ―λ‘ 2~10 λ΄μ μμ 2,3,5,7
λ§ νμΈνλ©΄ λλ€. μ½λλ‘ λνλ΄λ©΄ λ€μκ³Ό κ°λ€.
int N = Integer.parseInt(br.readLine);
boolean [] isPrime = new boolean [N];
// default κ° trueλ‘ λ°κΎΈκΈ°
for(int i = 0; i< isPrime.length; i++){
isPrime[i] = true;
}
// μμ νλ³ -> μμκ° μλ κ°λ€μ falseλ‘ λ°λλ€.
for(int i = 2; i*i <= N; i++){
if(isPrime[i]){
for(int j = i*i; j <= N; j += i){
// μμμ λ°°μλ€μ λͺ¨λ false μ²λ¦¬
isPrime[j] = false;
}
}
}
(2) μ i*i <= N μΈ iκΉμ§λ§ κ³μ°νλ©΄ λλμ?
μμ μμ μ²λΌ N == 120μ΄λΌκ³ ν΄λ³΄μ. 1111 = 121λ‘ 120μ λλλ€. 11μ λ€λ₯Έ λ°°μλ€μ 11λ³΄λ€ μμ μμλ₯Ό μ²λ¦¬νλ©° μ λΆ false μ²λ¦¬κ° λμλ€.
ex) 11 * μ§μ = 2μ λ°°μμμ μ λΆ μ²λ¦¬, * 3,6,9 = 3μ λ°°μμμ μ²λ¦¬ λ±.
λ°λΌμ λ§μ½ μ²λ¦¬κ° νμνλ€λ©΄, 2,3,5,7 κ·Έ λ€μ μμμΈ 11μ λ°°μμ λν μ²λ¦¬μΈλ°, μ΄λ λ΄κ° ꡬνλ €λ κ°μ λ²μλ₯Ό λμμμΌλ‘ μν΄λ λλ€.