WEB开发网
开发学院网页设计JavaScript JavaScript 质数(素数)算法 阅读

JavaScript 质数(素数)算法

 2009-08-25 20:13:22 来源:WEB开发网   
核心提示:算法一:测试 10 万以下的质数: 程序代码// 获得 0 到 limit 之间的素数// author: dronfunction getPRimeNumbers(limit){ var result = [2]; var is; if(limit < 2) return []; for(var i

算法一:

测试 10 万以下的质数:


 程序代码
// 获得 0 到 limit 之间的素数
// author: dron
function getPRimeNumbers(limit){
   var result = [2];
   var is;

   if(limit < 2)
     return [];

   for(var i = 3, s; i <= limit; i += 2){
     is = true;
     s = Math.sqrt(i);
     for(var j = 0, r, l = result.length; j <= l; j ++){
       r = result[j];
       if(r > s)
         break;
       if(i % r)
         continue;
       is = false;
       break;
     }
     is && result.push(i);
   }

   return result;
}


算法二:


 程序代码
var stopwatch = new Date();     // 计时器, 初始化.
var MaxNum = 100000;         //  查找 2到MaxNum 这范围内的素数  ( MaxNum 要>= 2 ).
var i, j;              // 计数器.
var count = 1;           // 初始化素数的个数, 因为我们从2开始计, 所以初始化为 1.
var PrimeTemp = [];         // 在这个数组做记号, 做了记号的, 全不是素数.
var PrimeArys = [2];        // 贮存素数的 数组.  因为 MaxNum >= 2, 所以第一个数组元素的值为 2 .
var oNum = Math.ceil( Math.sqrt( MaxNum ) );  // 为什么用 开方?  看到下面2个 for 没.
// 把不是素数的做 "记号".
for(i=3; i<oNum; i+=2)       //  +=2 ???  我们整个程序都不用双数, 全用单数, 这样就快2倍了.
if( PrimeTemp[i]==null )      // 初始化 PrimeTemp 的数组, 数组里面当然什么都没有.
for(j=i; i*j<=MaxNum; j+=2)    // i 的 j 倍一定不是素数, 但我们要 i*j 来看看是否超过了 MaxNum
PrimeTemp[ i*j ] = 0;       // 初始化 PrimeTemp 里的元素, 现在来帮它们做一个 "记号". 因为这个元素"不是"素数.
// 输出素数了.
for(i=3; i<=MaxNum; i+=2)        // +=2 ,不要忘记, 我们不用双数的.
   if( PrimeTemp[i]==null )        // 如果是 true , 这就表明 这个没有被做 "记号" , 所以它是 素数.
     PrimeArys[ count++ ] = i;     // 是 素数 的话, 就存入 PrimeArys 数组.
document.write( PrimeArys.join(" ") , "<br><br>从2到"+MaxNum+"共有素数 "+count+" 个。");   // 用 join()提高输出效率
var t=new Date()-stopwatch;
alert("本次运行了 "+t+" 毫秒。");             //看看 程序运行了多久.

Tags:JavaScript 质数 素数

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接