Javascript получение n-го простого числа

#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