Prime逆转算法无法正常工作

时间:2018-02-21 08:21:21

标签: javascript

我正在尝试解决以下问题:

考虑范围0到10.此范围内的素数为:2,3,5,7,因此素数对为:(2,2),(2,3),(2,5), (2,7),(3,3),(3,5),(3,7),(5,5),(5,7),(7,7)。

让我们以一对(2,7)为例得到产品,然后将结果的数字相加如下:2 * 7 = 14,1 + 4 = 5.我们看到5是素数数。类似地,对于对(7,7),我们得到:7 * 7 = 49,而4 + 9 = 13,这是一个素数。

您将获得一个范围,您的任务是返回恢复为素数的对的数量,如上所示。在范围(0,10)中,只有4个素数对以类似的方式最终成为素数:(2,7),(3,7),(5,5),(7,7)。因此,求解(0,10)= 4)

注意,范围的上限不会超过10000.范围(0,10)表示:0 <= n&lt; 10。

我想出了这个解决方案,但它并不适用于所有情况。我的代码从107传递了大约90个测试,我无法弄清楚问题是什么。 例如:a:94 b:971 - 它应该返回3777但是我得到3834。

function isPrime(n) {
    if(n < 2){
        return false;
    }
    for (var i = 2; i <= parseInt(Math.sqrt(n)); i++) {
        if (n % i === 0) {
            return false;
        }
    }
    return true;
}

function getPrimes(s, e) {
    var primes = [];
    for (var p = s; p <= e; p++) {
        if(isPrime(p)){
            primes.push(p);
        }
    }
    return primes;
}

function generatePairs(primes){
    var pairs = [];
    for(var i = 0; i < primes.length; i++){
        for(var j = i; j < primes.length; j++){
            pairs.push([primes[i], primes[j]]);
        }
    }
    return pairs;
}

function sumDigits(n){
    var sum = 0;
    while(n > 0){
        sum += n % 10;
        n = parseInt(n/10);
    }
    return sum;
}

function solve(a, b) {
    var pairs = generatePairs(getPrimes(a, b));
    var res = 0;
    for(pair of pairs){
        var tmp = sumDigits(pair[0] * pair[1]);
        if(isPrime(tmp)){
            res++;
        }

    }
    return res;
}

2 个答案:

答案 0 :(得分:0)

正如@glubus在上面的评论中提到的,您的b上限值,您需要将b-1传递给getPrimes方法。

 var pairs = generatePairs(getPrimes(a, b-1));

答案 1 :(得分:-1)

我自己没有调试,这里有一些一般性的想法:

你的(非常直接的)代码的基本思想似乎是正确的(尽管它的效率可能会有所不足)。

如果整体代码出错,则必须在某个特定地方出错。

所以你想检查每个阶段是否正确。

如果你的结果太高,你确定, 它表明一些非素数可能在你的素数列表中。 无论是在生成阶段还是在检查 - 最终答案阶段。 或者在某些情况下,你的循环可能会略微过远。

请注意,与平方根比较时,您不需要 平方根的整数形式。例如,sqrt(132)= 11.489 ......和 7&lt; 11.489以及7&lt; 11 11。

我的方法是找到失败的最小可能情况,并手动检查所有中间阶段。或者写一些检查码。

如果你要打电话&#34;解决&#34;反复地,你不需要一遍又一遍地生成所有的素数和对(尤其是素数),因为它们永远不会改变(或者至少它们已经很长时间没有了)。