[英]Why does my JavaScript Prime Number-Generator not work?
該程序的目的是列出從1開始的所有素數。 我是一個完整的新手。 我開始用C ++編寫此程序(未成功),然后翻譯成此(JS)。我知道一些問題,但不知道如何解決:處理全局變量,編寫替換,編寫前沒有超時等是很重要的我使用外部JS文件? 總而言之,我該如何進行這項工作?
<!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>
注意事項:
for (runs < found)
完成加載並關閉 document
后,不能使用document.writeln()
。 此后使用它們將重新打開document
,將其重置為空白。
要在此之后修改DOM,您需要使用innerHTML
或document.createElement()
和element.appendChild()
。
var line = document.createElement('div'); line.innerHTML = number; document.body.appendChild(line);
為了避免無限遞歸並使UI線程有機會更新頁面的顯示,可以在再次調用test
時使用計時器 :
setTimeout(test, 100);
在數學方面,
var prime = [1];
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
總是進入else
分支進行runs = 0
。
您可以從var prime = [2];
或使用var prime = [];
並且var found = 0;
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.