function isPrime(num) {
if(num === 2) {
return true;
}
for(let i = 2; i <= Math.floor(Math.sqrt(num)); i++){
if(num % i === 0){
// 한 번이라도 나누어 졌으니 소수가 아니므로 return false
return false;
}
}
// 나눠진 수가 없다면 해당 수는 소수이므로 return true
return true;
}
function isPrime(num) {
if(num === 2)
return true;
for(let i = 2; i<num; i++){
if(num % i === 0){
return false;
}
}
return true;
}
2부터 소수를 판별할 수 있으니 2를 먼저 return 해주고
나머지는 반복문을 이용해 나눠지는 수가 있는지 계산해보고
나눠지만 false를 return 해주고 for문을 빠져나올때까지
나눠지는 수가 없다면 true를 리턴해준다. (이때의 시간복잡도는 O(N) 이다.)
function isPrime(num) {
if(num === 2)
return true;
for(let i = 2; i<=num/2; i++){
if(num % i === 0){
return false;
}
}
return true;
}
다음은 두번째 방법이다. 이것도 첫번째 방법과 같지만 for문을 좀 더 적게 돌릴 수 있다.
num의 약수는 num의 절반을 넘을 수 없기 때문이다. (시간복잡도는 O(N) 이다.)
소수란 1과 자신만으로 나누어 떨어지는 1보다 큰 양의 정수를 뜻합니다.
2, 3, 5, 7, 11, 13... 와 같은 수는 소수가 됩니다.
소수를 구하는 3가지의 방법을 알아보겠습니다.
1이 아닌 2부터 n사이의 모든 정수를 다 나누어 떨어지는 수가 있는지 확인하는 방법입니다.
const isPrime=(n)=>{
for(let i=2; i<n; i++){
if(n%i===0){
return false;
}
}
return true;
n의 제곱근 (√n) 값으로 나누어 떨어지면 √n의 배수라는 뜻이므로 소수가 아니게 됩니다.
예를 들어보자면 25의 제곱근은 √25(5) 입니다.
이때 5까지만 반복문이 돌아가더라도 25는 5의 배수이므로 i가 5일 때 나누어 떨어지게 되고 소수가 아님을 판별할 수 있게 됩니다.
다른 예시로 49의 제곱근은 √49(7)입니다. 49도 7의 배수이므로 i가 7일 때 나누어 떨어지므로 소수가 아님을 알 수 있습니다.
즉 처음에 소개한 2, 3, 5, 7, 11, 13... 의 배수까지는 비교할 필요가 없습니다.
하지만 1은 소수가 아니기에 따로 구분을 해줘야합니다
const isPrime=(n)=>{
if(n<2) return false;
for(let i=2; i<Math.ceil(Math.sqrt(n)); i++){
if(n%i===0){
return false;
}
}
return true;
}
위방법은 2부터 n까지의 자신을 제외한 배수를 제거하다 보면 소수만 남는다는 원리입니다.
어떤 수의 배수가 되는 수는 (1과 자신의 수)가 아닌 다른 수로 나누어 떨어지기에 소수가 될 수 없습니다.
이때 √n까지만 판별을 해도 결과는 똑같습니다.
√25(5)는 5의 배수인 10, 15, 20, 25는 배수로 쳐 소수가 아닌 수로 분류됩니다.
그리고 5의 다음인 6은 이미 2의 배수로 소수가 아님이 분류가 완료되었기에 판별할 필요가 없어집니다.