2014-10-11 93 views
1

我想創建一個HTML 5 Web工作,將計算素數(從1凝視着)的數量給定值:我的JavaScript代碼是:Web工作質數計算

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++; 
    } 
} 
} 

此代碼是基於: http://www.codeproject.com/Articles/250102/An-HTML-progressbar-using-web-workers 但是,Web Worker腳本返回值8,對於輸入數字10顯然不正確。我在哪裏出錯了?

回答

0

你的邏輯是錯誤的,你只能確定素數,如果它不能整除直到最後。如果它在兩者之間可分解,則不是素數。我更新了下面的代碼。

     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); 
         } 
+0

玩。但無論我提供的THRESHOLD值如何,主頁上的worker.onmessage事件處理函數總是接收值0. – user2693135 2014-10-11 11:48:46

0

嘗試外移動的素數決定:

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; 
} 

isPrime功能

this SO answer這裏有一個jsFiddle這個代碼與我測試的代碼

+0

測試了代碼。對於THRESHOLD值10,它返回29,這是不正確的。另外,我想要素數的數量,而不是他們的總和。例如,該腳本應爲郵件的值5(1,2,3,5,7)爲THRESHOLD值10. – user2693135 2014-10-11 11:58:59

+0

好的。請參閱編輯的答案。順便說一句:1不是素數,請參閱https://primes.utm.edu/notes/faq/one.html。所以postMessage的THRESHOLD值爲10應該返回** 4 **。 – KooiInc 2014-10-11 12:36:45

+0

明白了。我很傻。你讓我今天一整天都感覺很好。 – user2693135 2014-10-11 15:51:45