输入超过 999 时 JS 编号范围错误
Errors in JS number range when inputs over 999
我正在尝试编写一个脚本,将所有素数放在一定范围内,这是我的带有 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 来完成这么简单的任务。
如果您确定起始值为 200,终止值为 100。
您需要检查起始值是否小于终止值。
if(sat > rti){
/* change rti value to maximum possible value with number of
digits in sat value.
*/
var power = rti.toString().length-1;
rti = Math.pow(10, power) - 1;
}
问题是您的开始和结束变量被存储为类型 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。
我正在尝试编写一个脚本,将所有素数放在一定范围内,这是我的带有 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 来完成这么简单的任务。
如果您确定起始值为 200,终止值为 100。
您需要检查起始值是否小于终止值。
if(sat > rti){
/* change rti value to maximum possible value with number of
digits in sat value.
*/
var power = rti.toString().length-1;
rti = Math.pow(10, power) - 1;
}
问题是您的开始和结束变量被存储为类型 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。