JavaScript求解孪生质数

如果2个数都是质数,而且它们相差为2,那么就可以说是一对“孪生质数”。

如何判断指定范围内的孪生质数?

一种高效的做法是结合筛法与缓存判断,可以很接近线性的效率。

用常规的判定质数方法,再使用缓存,也可以达到目的。

效率是ON*sqrtN))的,而且因为缓存的缘故,多次调用的情况下,性能也是很可观的。

下面,我提供了常规实现,具体上还可以优化,比如使用二分查找。

//缓存孪生质数
var cache = [[3,5],[5,7]];
//是否是质数
function isPrime(n){
    var factor = Math.sqrt(n);
    //最小的质数是2
    if(n < 2){
        return false;
    }
    //质数只有1和它本身,2个因子
	//否则是合数
    for(var i=2;i<=factor;i++){
        if(n % i == 0){
            return false;
        }
    }
    
    return true;
}

function twinPrime(n) {
	//缓存的最后一对孪生质数
    var last = cache[cache.length - 1];
	//如果n在已缓存范围内
    if(n < last[0] + 1){
		//直接返回数目
        for(var i=0;cache[i][0] < n;i++);
        return i;
    }
    else{
		//否则,查找并且缓存
        var start = last[0] + 1;
        for(var i=start;i<n;i++){
            if(isPrime(i) && isPrime(i+2)){
                cache.push([i, i+2]);
            }
        }
        return cache.length;
    }
}


猜你喜欢

转载自blog.csdn.net/esir82/article/details/78441925