Javascript 网络工作者素数计算

Javascript 网络工作者素数计算,javascript,web-worker,Javascript,Web Worker,我正在尝试创建一个HTML 5 Web Worker,它将计算给定值从1开始的素数:我的JavaScript代码是: var found = 0; var n = 1; var total = 0; var THRESHOLD = 10; while (total < THRESHOLD) { n += 1; for (var i = 2; i <= Math.sqrt(n); i++) { if (!(n % i == 0)) { total++;

我正在尝试创建一个HTML 5 Web Worker,它将计算给定值从1开始的素数:我的JavaScript代码是:

var found = 0;
var n = 1;
var total = 0;
var THRESHOLD = 10;

while (total < THRESHOLD) {
n += 1;
for (var i = 2; i <= Math.sqrt(n); i++) {
    if (!(n % i == 0)) {
        total++;
        postMessage(found);
    }
    else {
        found++;
    }
 }
}
此代码基于:
但是,Web Worker脚本返回值8,这对于输入数字10显然是不正确的。我在这里哪里出错了?

你的逻辑是错误的,只有当素数直到最后都不可除时,你才能确定它。如果它可以被整除,它就不是素数。我已经更新了下面的代码

                       var found = 0;
                       var n = 1;
                       var total = 0;
                       var THRESHOLD = 10;

                      while (total < THRESHOLD) {
                       n += 1;
                       found = 0 ;
                       for (var i = 2; i <= Math.sqrt(n); i++) {
                       if ((n % i == 0)) {
                       found = 1;
                       break;
                       }

                       }
                       if(found == 0)
                              total++;
                              postMessage(found);
                       }

尝试将质数确定移到外部:

var n = 0
   ,total = 0;
   ,THRESHOLD = 10;

while (++n < THRESHOLD) {
  total += isPrime(n) ? 1 : 0;
}

postMessage(total); //=> 4

function isPrime(number) {
    var start = 2;
    while (start <= Math.sqrt(number)) {
        if (number % start++ < 1) return false;
    }
    return number > 1;
}
有关iPrime函数,请参见


下面是此代码的一个示例

我测试了代码。但是,不管我提供了什么阈值,主页上的worker.onmessage事件处理程序总是接收值0。测试代码。对于阈值10,它返回29,这是不正确的。另外,我要的是素数的个数,而不是它们的和。例如,脚本应该将阈值10.Ok的值5 1、2、3、5、7作为postMessage。请参见编辑后的答案。顺便说一句:1不是质数,请参阅。所以阈值为10的postMessage应该返回4;