我正在尝试解决以下问题:
考虑范围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;
}
答案 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;反复地,你不需要一遍又一遍地生成所有的素数和对(尤其是素数),因为它们永远不会改变(或者至少它们已经很长时间没有了)。