0

我正在学习 JS,偶然发现了一个输出素数 < 100 的脚本。但我不确定我是否完全理解它是如何工作的。如果有人能解释一下,我会很高兴。:)

所以这里是:

for (var counter = 0; counter <= 100; counter++)
{
    for (var i = 2; i <= counter-1; i++)
        if (counter%i === 0) break;
    if(i === counter)
        console.log(counter);
}
4

3 回答 3

1

根据定义,素数只能被它们自己和 1 整除。外层for var(counter = 0; ...)循环遍历从 0 到 100 的数字。然后内层循环for (var i = 2; ...)尝试将外层数除以 2 和计数器值之间的每个数字。如果其中任何一个除数而没有余数,则循环被打破。就是这样if (counter%i === 0) break;。如果我们跳出循环并且i === counter,它是一个素数,否则它不是 - 根据定义。

于 2013-04-01T19:55:58.673 回答
1
/* For every number from 0 to 100, do the following: */
for (var counter = 0; counter <= 100; counter++)
{
    /* Loop through values from 2 to 1 before the counter. */
    for (var i = 2; i <= counter-1; i++) {
        /* if the remainder of dividing counter by the current value of `i` is zero,
         * we know we don't have a prime, so break out of the loop:
         */
        if (counter%i === 0) break; 
    }
    /* If the loop completed and `i` is equal to the counter, that means counter is not
     * divisible by anything except for 1 and itself, making it prime
     */
    if(i === counter)
        console.log(counter);
}
于 2013-04-01T19:57:46.933 回答
0

我不确定你知道多少 JavaScript,所以其中一些可能是非常基础的。

首先,请记住质数是其唯一因数为 1 和自身的数。

所以第一行说它从 0 循环到 100,counter作为变量保存这个数字。

下一行for (var i = 2; i <= counter-1; i++)从 2 循环到counter-1(注意它不包括 1 和counter)并用于i保存这个数字。

接下来,if (counter%i === 0) break;测试是否counter可被 整除i:余数运算符%返回余数(如长除法),例如11 % 3将返回2因为 11 除以 3 得到 3 余数 2;如果余数counter % i0(===是比 更严格的等式==,但这完全是一个不同的答案) 这意味着它counter可以被整除i,因此不是素数。该break语句告诉它退出最内层循环(即,循环结束i),因此程序递增counter并继续。

如果前一行没有因为 的任何值而中断icounter则为素数——具体而言,在循环体的末尾,i递增(现在等于counter),语句的i <= counter-1计算结果为 false,循环结束。所以现在i === counter是真的,所以console.log(counter)在控制台中显示这个值。

于 2013-04-01T19:57:29.310 回答