2016-06-21 2 views
0

초보자이며 소수 테스트를 완료하려고하는데 문제가 있습니다.소수 테스트와 관련된 문제 자바 스크립트

var n = Number(prompt("Input the number you want to check for prime:")); 
var i; 


if (n < 2) { 
    alert(n + " is not a prime number."); 
} 
for (var i = 2; i <= Math.sqrt(n); i++) { 
    if (n % i === 0) { 
     alert(n + " is not a prime number."); 
     break; 
    } 

    else { 
     alert(n + " is a prime number."); 
     break; 
    } 
} 
그것은 경우 팝업되지 않습니다 경고를 제외하고 제대로 실행중인

I 입력 3이하고 외설 경우에도 그 안에 3 소수로 돌아오고있는 모든 숫자 '여기에 내가 무엇을 가지고 티. 그 외에는 모든 테스트가 효과가있었습니다.

+0

2와 3은 모두 소수이며, 문제는 루프를 구성한 방식입니다. 처음부터 끝까지 루프에서 빠져 나오고 있습니다. 대신에 최종 진술이 루프에서 벗어나야합니다. 또한 검사를 완전히 종료해야하므로 a) 함수로 감싸서 "return"할 수 있도록하거나 b) 즉시 경고하는 대신 플래그를 설정하여 isPrime = true; break;를 호출하고, 나중에 isPrime === true를 체크한다. –

+0

'n'이 소수임을 발표 할 때 모든 약수를 테스트하지 않았기 때문입니다. –

답변

1

아에 요청 된 질문에 대한 참조를하시기 바랍니다, 당신의 문제는 루프를 구조 한 방법입니다. 수표가 완료되었는지 여부와 관계없이 파산 중입니다.

var n = Number(prompt("Input the number you want to check for prime:")); 
var i; 
var isPrime = true; 

if (n < 2) { 
    isPrime = false; 
} else if (n < 4 && n >= 2) { 
    // isPrime is already true 
} else if (n % 2 === 0) { 
    isPrime = false; // no divisor of 2 can be prime 
} else { 
    var sqrtN = Math.sqrt(n); 
    for (var i = 3; i <= sqrtN; i = i + 2) { 
     if (n % i === 0) { 
      // Only break out of the loop if a match is found 
      isPrime = false; 
      break; 
     } 
    } 
} 
if (isPrime) { 
    alert(n + " is a prime number."); 
} else { 
    alert(n + " is not a prime number."); 
} 

또는, 아마 더 조직 솔루션 :

물론
function isPrime (n) { 
    n = parseInt(n); 
    var i; 
    if (Number.isNaN(n)) { 
    return false; 
    } else if (n < 2) { 
    // 1 is not prime 
    return false; 
    } if (n < 4) { 
    // 2 and 3 are prime, so why not skip checking them? 
    return true; 
    } else if (n % 2 === 0) { 
    // No number divisible by 2 is prime. 
    return false; 
    } else { 
    // This won't change, so calculate it once as suggested by Weather Vane. 
    var sqrtN = Math.sqrt(n); 
    // 4, 6, 8... All divisible by 2, and would be caught by initial check. 
    for (i = 3; i < sqrtN; i = i + 2) { 
     // Not a prime if it's evenly divisible. 
     if (n % i === 0) { 
     return false; 
     } 
    } 
    // Otherwise prime. 
    return true; 
    } 
} 
+1

a) 제곱근을 한 번만 계산하고, b) 특히 '2'를 확인하고, c) 심지어 건너 뜁니다. for (var i = 3; i <= rootn; i + = 2)를 가진 제수 –

0
var UI = window.prompt("Enter a whole number to test as a prime number: \n", "0"); 
var TV = parseInt(UI, 10); 
var HITS = 0; 
var DD = TV; 
while (DD > 0) { 
    if (TV % DD === 0) { 
     HITS++; 
    } 
    DD--; 
} 

if (HITS > 2) { 
    document.write(UI + " is a NOT prime number"); 
} else { 
    document.write(UI + " is a prime number"); 
} 

유래 link to the old question

+1

소수를 검사 할 때 숫자의 제곱근까지만 검사하면됩니다. – MayorMonty

1

. n % i0이 아니면 in을 나누지 않지만, n은 소수임을 의미하지는 않습니다. 그 말을하기 위해서는 모두 i을 확인해야합니다.

또한 각 반복마다 값 비싼 Math.sqrt(n)을 다시 계산하지 마십시오. NaN에 유의하십시오. 물론

var n = Number(prompt("Input the number you want to check for prime:")); 
 
function isPrime(n) { 
 
    if (n < 2 || !n) return false; 
 
    for (var i = 2; i*i <= n; i++) { 
 
    if (n % i === 0) return false; 
 
    } 
 
    return true; 
 
} 
 
alert(n + " is " + (isPrime(n) ? "" : "NOT ") + "a prime number.");

이 알고리즘은 기하 급수적 인 ( pseudo-polynomial). 큰 n에 사용하지 마십시오. 대신에 예를 들어 Miller–Rabin primality test 또는 AKS primality test이며 다항식입니다.

관련 문제