【问题标题】:Why does my JavaScript Prime Number-Generator not work?为什么我的 JavaScript 素数生成器不起作用?
【发布时间】:2013-05-08 15:48:08
【问题描述】:

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

【问题讨论】:

标签: javascript math web-applications primes


【解决方案1】:

在数学方面,

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 = 0 输入else 分支。

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

【讨论】:

  • 太棒了!哇!它正在工作!有什么办法让它自动滚动到底部?
  • 发现问题:它没有过滤 5 的倍数。
  • 我忽略了一件事情:var number = 1;
  • @user2363023 从var number = 3; 开始我看不到这样的问题。但我无法让它停止,例如插入条件number &lt; 100 会被完全忽略。怎么回事??
  • if(number % prime[Math.round(runs / 2)] !== 0) 背后的想法是什么?
【解决方案2】:

需要注意的几点:

  1. for (runs &lt; found)

    你似乎想要一个while loop 这里。 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线程有机会更新页面的显示,你可以在再次调用testuse a timer

    setTimeout(test, 100);
    

【讨论】:

  • 第 2 步会生成一个列表吗?
  • @user2363023 如果您每次都创建一个新元素,则可以。将 var line = ... 移动到 test() 中,而不是将其作为全局变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
相关资源
最近更新 更多