原文的传送门http://bbs.51js.com/viewthread.php?tid=85219 <script type="text/javascript"><!-- 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+" 毫秒。"); //看看 程序运行了多久. // --></script>