2016-07-28 2 views
2

나는 오랫동안 도전에 도전하려고 노력 해왔다. 여러 솔루션과 조언을 온라인으로 읽지 만 제대로 적용 할 수는 없었다.자바 스크립트 소수 번호 확인

지침은 "하나의 정수 인수를 사용하고 정수가 소수인지에 따라 true 또는 false를 반환하는 함수 isPrime을 정의합니다."

나는 많은 것들을 시도했지만 이것은 내가 얻을 수 있었던 가장 먼 :

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else return true; 
} 

을하지만 내가 말한거야 ". (9)는 소수 아니다"

도움을 주시면 감사하겠습니다.

+0

단계. 'num'은'1'보다 작거나'2'와 같지 않으므로 루프를 치게됩니다. 따라서 '9 % 2'는 '1'이므로 'return true'는 'else'에 해당하므로 9가 소수라고 주장합니다. 분명하지 않습니다. –

답변

3

else case를 피하고 for 루프를 완료 한 후에 만 ​​리턴해야합니다. 루프 카운트는 i <= Math.sqrt(num) (@PatrickRoberts)으로 조건을 업데이트하면 줄일 수 있습니다. 참고로

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    // storing the calculated value would be much 
    // better than calculating in each iteration 
    var sqrt = Math.sqrt(num); 

    for (var i = 2; i <= sqrt; i++) 
    if (num % i === 0) return false; 
    return true; 
} 

: 루프 num % i === 0 ( 9 % 2)의 첫 번째 반복에 코드에서이 false 것과는 다른 문 ( true)을 반환합니다.

+2

이제 [시브 오브 에라 토 스테 네스] (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)에 대해 이야기 해 보겠습니다. 왜냐하면 얼굴을 보자. 이것은 매우 비효율적 인 구현입니다. –

+1

감사합니다. –

+1

소원 내가 한 번 이상 upvote 수, 아주 좋은 대답. –

4

for 루프의 else return true;에 문제가 있습니다. i 당신이 9 % i, 당신은 else 블록과 return true을 실행하지 0 것을 확인 직후 2, 첫 번째 반복에서

.

모든 반복이 return false으로 실패하기 전에 return true을 입력하지 않아야합니다.

+0

반환 사실을 설명 주셔서 감사합니다, 나는 결국 이해합니다! –

-1

이 루프 (또는 생략 else 문)에 키워드를 계속하지만, 경우와 다른 사람이 반환 키워드를 가지고 모두가 있어야합니다. 그래서, 루프 만 반복은 내가 = 2

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else continue; // omittable 

    return true; 
} 

당신은 많은 것들을이 코드의 기능/성능을 향상하기 위해 할 수있는 대한. 예를 들어, i < num for 루프의 조건은 매우 넓어 입니다. num의 제곱근은 더 높은 경계에 충분합니다.

+2

여기서'else continue'는 쓸모가 없습니다. –

+0

예,하지만 지금은 차이를 보여주기 위해 썼습니다. –

0
function primeNo(){ 
//"number1" is "ID" of HTML input block. 
var num2 = document.getElementById("number1").value; 
var dev = num2/2; 
var i; 
for(i=2; i < dev ; i++){ 
    if(num2%i == 0){ 
     //"ans1" is "ID of <p> where ans needs to display" 
     document.getElementById("ans1").innerHTML = "Not a Prime No"; 
     break; 
    } 
    else{ 
     document.getElementById("ans1").innerHTML = "Prime No"; 
    } 
} 

} 코드를 통해

+0

"1"은 소수 목록에 포함되지 않으므로 루프는 2로 시작합니다. 숫자가 숫자 값의 절반까지 완전히 나눌 수 있으면 소수가되지 않습니다. 그리고 "Break"는 리마인더가 "0"이면 탈출하는 데 사용됩니다. –