为什么我的JavaScript质数生成器不工作

Why does my JavaScript Prime Number-Generator not work?

本文关键字:工作 我的 JavaScript 为什么      更新时间:2023-09-26

这个程序的目的是列出从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>

在数学方面,

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

总是进入runs = 0else支路。

您可以从var prime = [2];var prime = [];var found = 0;开始。

注意事项:

  1. for (runs < found)

    你似乎想要一个while循环。for循环不能仅由一个条件组成。

  2. document.writeln()不能在document加载完成且关闭后使用。在此之后使用它们将重新打开document,将其重置为空白。

    在此之后修改DOM,您需要使用innerHTMLdocument.createElement()element.appendChild()

    var line = document.createElement('div');
    line.innerHTML = number;
    document.body.appendChild(line);
    
  3. 为了避免无限递归并给UI线程一个更新页面显示的机会,您可以在再次调用test时使用计时器:

    setTimeout(test, 100);