[英]Why does my JavaScript Prime Number-Generator not work?
The aim of this program is to list all the prime numbers from 1 up. 该程序的目的是列出从1开始的所有素数。 I am a complete novice.
我是一个完整的新手。 I began writing this in C++ (unsuccessfully) and translated to this (JS) I am aware of some problems but don't know how to solve them: handling global variables, writing replaces, no timeout before writing, etc. is it important that i use an external JS file?
我开始用C ++编写此程序(未成功),然后翻译成此(JS)。我知道一些问题,但不知道如何解决:处理全局变量,编写替换,编写前没有超时等是很重要的我使用外部JS文件? In summary, how do i make this work?
总而言之,我该如何进行这项工作?
<!doctype html>
<html>
<head>
<script>
var number = 3; //to be run through the prime test
var prime = [2]; //numbers found to be prime
var found = 1; //counter for primes found
var runs = 0; //counter for times number has been tested
//numbers are tested against all smaller found primes
function test()
{
window.scroll(0,document.height); //automatically view the latest prime
var line = document.createElement("div");
while(runs < found && (prime[runs] < (number / 2))) //has number passed all tests
{
if(number % prime[runs] !== 0) //is number divisible by smaller prime
{
runs = runs + 1; //number passed a test
}
else //number is not prime
{
number = number + 1; //next number generated
runs = 0; //reset test counter for next number
setTimeout(test, 100); //start running next number tests
}
} //number passed all tests
line.innerHTML = number; //prime number displayed
document.body.appendChild(line);
prime[found] = number; //prime number saved for testing
found = found + 1; //counter for found is increased
number = number + 1; //next number generated
runs = 0; //reset test counter for next number
setTimeout(test, 100); //start running next number tests
}
</script>
</head>
<body>
<form>
<input type="button" onclick="test()">
</form>
</body>
</html>
A few things to note: 注意事项:
for (runs < found)
You appear to want a while
loop here. 您似乎想要
while
此处循环 。 for
loops cannot consist just of a condition. for
循环不能仅由条件组成。
document.writeln()
cannot be used after the document
has finished loading and has closed . 完成加载并关闭
document
后,不能使用document.writeln()
。 Using them after this will re-open the document
, resetting it to blank. 此后使用它们将重新打开
document
,将其重置为空白。
To modify the DOM after this, you'll need to use innerHTML
or document.createElement()
and element.appendChild()
. 要在此之后修改DOM,您需要使用
innerHTML
或document.createElement()
和element.appendChild()
。
var line = document.createElement('div'); line.innerHTML = number; document.body.appendChild(line);
To avoid infinite recursion and give the UI thread a chance to update the display of the page, you can use a timer when calling test
again: 为了避免无限递归并使UI线程有机会更新页面的显示,可以在再次调用
test
时使用计时器 :
setTimeout(test, 100);
On the mathematical side, 在数学方面,
var prime = [1];
1
isn't a prime, and since 1
divides every number, 1
不是质数,由于1
除以每个数字,
while (runs < found) //has number passed all tests
{
if (number % prime[runs] !== 0) //is number divisible by smaller prime
{
runs = runs + 1; //number passed a test
}
else //number failed a test
{
number = number + 1; //next number generated
runs = 0; //reset test counter for next number
setTimeout(test, 1000); //start running next number tests
}
} //number passed all tests
always enters the else
branch for runs = 0
. 总是进入
else
分支进行runs = 0
。
You can start with var prime = [2];
您可以从
var prime = [2];
or with var prime = [];
或使用
var prime = [];
and var found = 0;
并且
var found = 0;
. 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.