JavaScript 质数(素数)算法

王朝学院·作者佚名  2009-08-26
窄屏简体版  字體: 小  |  中  |  大  |  超大  

算法一:

测试 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+" 毫秒。"); //看看 程序运行了多久.

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航