javascript - 输入超过999时JS数字范围错误

标签 javascript html numbers range primes

我试图编写一个脚本来输出一定范围内的所有素数,这是我的带有js代码的页面。

<html>
<style>
.div1 {
    width: 69%;
}
</style>
<div class="div1">
<p id="otpt"></p>
</div>
<br>
<p id="hmpr"></p>
<script>
function isNInt(str) {
    return /^\+?(0|[1-9]\d*)$/.test(str);
}

var sat = prompt("Number to Start at: ")
while (isNInt(sat)==false){
  var sat = prompt("Not a valid Number: (Number to Start at)", sat)
}
var rti = prompt("Number to stop at: ")
while (isNInt(rti)==false){
  var rti = prompt("Not a valid Number: (Number to stop at)", rti)
}
//function to test if number is a prime number
function isPrime(num) {
  for(var i = 2; i < num; i++)
    if(num % i === 0) return false;
  return num !== 1;
}
var primecntr = 0
for (i=sat; i<rti; i++){
  if (isPrime(i)===true){
    document.getElementById('otpt').innerHTML = document.getElementById('otpt').innerHTML.concat(i, " ")
    var primecntr = primecntr+1
 }
}
document.getElementById('hmpr').innerHTML = primecntr + " Prime Numbers"
</script>
</html>

该代码适用于任何低于 1000 的数字,但不适用于高于 1000 的数字。通过输入 200 然后输入 1000 重新创建错误,它应该打印从 201 到 999 的所有素数,但输出是 0 个素数。如果我可以避免它,我不想使用 jQuery 来完成如此简单的任务。

最佳答案

问题在于您的开始和结束变量被存储为string类型,而不是number。我对它们进行了转换,并做了一些优化:

  • isPrime() 函数现在仅检查平方根(否则您只会得到重复的因子) - 随着值的增加,这会产生很大的差异。

  • 我已将您的输出存储在字符串中,然后将其写入末尾以避免重复将内容写入 DOM。

<html>
<style>
.div1 {
    width: 69%;
}
</style>
<div class="div1">
<p id="otpt"></p>
</div>
<br>
<p id="hmpr"></p>
<script>
function isNInt(str) {
    return /^\+?(0|[1-9]\d*)$/.test(str);
}

var sat = prompt("Number to Start at: ")
while (!isNInt(sat)){
  var sat = prompt("Not a valid Number: (Number to Start at)", sat)
}
var rti = prompt("Number to stop at: ")
while (!isNInt(rti)){
  var rti = prompt("Not a valid Number: (Number to stop at)", rti)
}
//function to test if number is a prime number
function isPrime(num) {
  for(var i = 2; i < Math.floor(Math.sqrt(num)) + 1; i++)
    if(num % i === 0) return false;
  return num !== 1;
}
sat = Number(sat);
rti = Number(rti);
var primecntr = 0;
var primeString = "";
for (i=sat; i<rti; i++) {
  if (isPrime(i)) {
    primeString = primeString.concat(i, " ");
    primecntr++;
  }
}
document.getElementById('otpt').textContent = primeString;
document.getElementById('hmpr').textContent = primecntr + " Prime Numbers";
</script>
</html>

这可以使用代码片段进行测试,选择任意结束数字 > 999。

关于javascript - 输入超过999时JS数字范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541892/

相关文章:

javascript - 如何指定项目根目录来从HTML调用JS函数

javascript - 奇怪的 JQuery location.reload() 行为?

html - 使用css对齐字符串中不同大小的字符

SQLite 函数用前导零格式化数字?

java - 转换0-10的整数并替换为与整数对应的英文单词

JavaScript ajax(获取)

javascript - 我想传递一个对象的路径

javascript - sessionStorage 和粘性 session

javascript - 在 contenteditable div 中用 span 包裹每个单词

java - 在 Java 中比较/评估数字