【发布时间】:2016-08-26 12:06:58
【问题描述】:
我正在尝试编写一个显示从 0 到 100 的素数的脚本,但是当我执行它时,浏览器崩溃了。 JSHint 没有检测到任何错误。
我想了解为什么此代码不起作用:我对找到完成相同任务的完全不同的代码 (like this one) 不感兴趣。
这是我编写的第一个代码,所以我提前为我忽略的所有愚蠢错误道歉。
var i;
var m;
var primeArr = [2, 3, 5, 7, 11, 13, 17, 19];
var theMaxNumber = 100;
var theMinNumber = 21;
var theCounter = -1;
function myFunction() {
for (i = theMinNumber; i < theMaxNumber; i += 2) {
for (m = 0; m < primeArr.length; m++) {
if (i % primeArr[m] !== 0) {
theCounter++;
if (theCounter === primeArr.length) {
primeArr.push(i);
}
if (m === primeArr.length) {
theCounter = -1;
}
}
}
}
console.log( primeArr.toString());
}
理论上应该是这样工作的:
1) 该函数确定数 i 是否可被比自身小的素数整除。
2) 如果是,theCounter 被重置,i 增加 2。
3) 如果不是,theCounter 加一。如果在循环结束时,i 不能被所有小于自身的素数整除,则表示它是素数:i 被压入数组(因为 theCounter = == primeArr.length),那么 i 加二。
编辑:我修复了代码中的所有错误,现在可以完美运行:
var i;
var m;
var primeArr = [3, 5, 7, 11, 13, 17, 19];
var theMaxNumber = 100;
var theMinNumber = 21;
var theCounter = 0;
function myFunction() {
for (i = theMinNumber; i < theMaxNumber; i += 2) {
theCounter = 0;
for (m = 0; m < primeArr.length; m++) {
if (i % primeArr[m] !== 0) {
theCounter++;
}
if (theCounter === primeArr.length) {
primeArr.push(i);
}
}
}
primeArr.unshift(2);
console.log( primeArr.toString());
}
【问题讨论】:
-
在纸上播放。只有当
i % primeArr[m] == 0有意义时才做某事,因为那时你已经找到了一个因素。 JavaScript 是快速和良好学习的不幸选择。也许主流java会做。 (自以为是) -
您为素数定义的数组已经只包含素数。你想在这里找到什么?在这行代码中 if (i % > primeArr[m] !== 0) { w++; --> 试图增加一个没有在任何地方声明的变量。
-
我不小心写了 w 而不是 theCounter,谢谢你的评论。我编写了那行代码,以便为列表中的每个素数划分 i。如果 i 对它们中的任何一个都不可整除(模数不为 0),则意味着它也是一个素数并且它已添加到列表中。在第一个“for 循环”中,从 21 到 100 的所有素数都应该被添加到 primeArr。
标签: primes