1 이상의 자연수를 입력받아 2부터 해당 수까지의 소수를 리턴
function listPrimes(num) {
let result = '2';
**let isPrime = true;**
for (let i = 3; i <= num; i += 2) {
for (let n = 3; n <= Math.sqrt(i); n += 2){
if (i % n === 0) {
isPrime = false;
break;
}
}
if (isPrime === true) {
result = result + '-' + i;
}
}
return result;
}
전체적인 로직은 파악한 상황, 그런데 11이상의 소수부터 리턴이 안됨..
이유를 몰라 한참 헤매었다. 그러다가 원인을 알게됨.
바로 위 코드에서 주석 처리한 부분이 문제였던 것.(표시를 위해 주석처리함)
반복문 밖에 저렇게 isPrime = true 를 선언하게 되면,
반복문 내 i % n === 0 이 되는 첫번째 9 % 3 === 0 구간에서
isPrime은 false로 변한다.
그렇게 되면 그때부터 반복문 내에 있ㄴㄴ
if (isPrime === true)
이 부분의 의미가 사라진다. 반복문이 재실행되도 isPrime은 여전히 false이기 때문.
그래서 결론은 반복문이 재실행 될때마다, isPrime = true값을 새로 부여해야 한다.
function listPrimes(num) {
let result = '2';
for (let i = 3; i <= num; i += 2) {
**let isPrime = true;**
for (let n = 3; n <= Math.sqrt(i); n += 2){
if (i % n === 0) {
isPrime = false;
break;
}
}
if (isPrime === true) {
result = result + '-' + i;
}
}
return result;
}
(주석처리) 이렇게 반복문 내에 isPrime = ture; 를 써줘야 한다.