JavaScript 质数(素数)算法

  • 来源: www.knowsky.com 作者: sevenleaf   2010-04-21/13:36
  • 算法一:

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


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多