#javascript
#javascript
Вопрос:
Это должно вернуть n-е простое число (n — число, заданное пользователем). Он отлично работает для первых нескольких чисел (1 возвращает 2, 2 возвращает 3, 3 возвращает 5), но когда задано 5, возвращается 9, которое не является простым (должно быть 11). Это происходит и с другими числами выше этого (7 возвращает 15, когда должно быть 17).
Материал «документа» связан с HTML, где я получаю значение пользователя и для отображения простого числа.
function isPrime(value) {
for(var i = 2; i < value; i ) {
if(value % i === 0) {
return false;
}
}
return value > 1;
}
function generatePrime() {
var userValue = document.getElementById("inputValue").value;
var iter = 1;
var returnValue = 2;
//checks for an integer
if (parseInt(userValue) === parseFloat(userValue)) {
//checks if the user inputted a value above 0
if (userValue > 0) {
//loops to find the correct prime
while (iter < userValue) {
if (isPrime(returnValue)) {
returnValue = 1;
iter = 1;
}
if (!isPrime(returnValue)) {
returnValue = 1;
}
}
}
else {
returnValue = "That is not a number above 0!";
}
}
else {
returnValue = "That is not a number!";
}
document.getElementById("returnValue").innerHTML = returnValue;
}
Мне нужна помощь в том, чтобы заставить это возвращать правильное число.
Ответ №1:
Попробуйте это.
function nextPrime(value) {
if (value > 2) {
var i, q;
do {
i = 3;
value = 2;
q = Math.floor(Math.sqrt(value));
while (i <= q amp;amp; value % i) {
i = 2;
}
} while (i <= q);
return value;
}
return value === 2 ? 3 : 2;
}
function generatePrime() {
var userValue = document.getElementById("inputValue").value;
var value = 0, result = [];
for (var i = 0; i < userValue; i ) {
value = nextPrime(value);
result.push(value);
}
document.getElementById("returnValue").innerHTML = result[userValue-1];
}
<!DOCTYPE html>
<html>
<head>
<script>
</script>
</head>
<body>
Input value: <input type="text" name="inputValue" id="inputValue"/>
<button onclick="generatePrime()">Prime number</button>
<div id="returnValue">Test: </div>
</body>
</html>
Комментарии:
1. пожалуйста, проголосуйте за .. спасибо @Laketek за принятие в качестве ответа
Ответ №2:
Вы можете попробовать что-то вроде этого:
function getNthPrimeNumber(n){
var count = 0;
var num = 2;
while(count != n){
num = getNextPrimeNumber(num);
}
return num;
}
function getNextPrimeNumber(n){
for(var i = n; i< n*n; i ){
if(isPrime(i)) return i
}
return 0;
}
function isPrime(n){
for(var i = 2; i< n; i )
if (n%i===0)
return false;
return true;
}
console.log(getNthPrimeNumber(0))
console.log(getNthPrimeNumber(2))
console.log(getNthPrimeNumber(5))
Комментарии:
1. Это действительно работает, мне нужно посмотреть, смогу ли я включить его в HTML, поскольку я работаю вместе с обоими языками. Спасибо: D
2. Так и будет. это просто алгоритм для получения n-го простого числа. Как только вы его получите, вы можете обработать соответствующим образом. Это скорее служебная функция.
Ответ №3:
Вы могли бы уменьшить диапазон итераций для функции isPrime() :
function isPrime(value) {
for(var i = 2; i < Math.sqrt(value) 1; i ) {
if(value % i === 0) {
return false;
}
}
return value > 1;
}
Комментарии:
1. 3 затем возвращает 4, когда оно должно быть 5 (также портит большие n-е)
2. вы заработаете время, если введете огромное значение. Потому что n >> sqrt(n) 1 для больших значений n
3. Я забыл добавить 1, но даже тогда 2 возвращает 5, что неверно
4. Ни одна функция не является простой (значение), просто возвращает true или false и работает быстрее, если вы уменьшаете диапазон поиска на sqrt(значение) 1