以下代码似乎总是返回true,无论我插入的是什么值,我都看不出原因。如果n = 8,那么arr2应该包含i的值为2,4和8? 有人可以解释一下吗?非常感谢你。
var primetest = function(n){
var divisor = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
for (var i = 0; i < divisor.length; i++) {
var arr2 = [];
if(n%divisor[i] == 0) {arr2.push(i);}
if(arr2.length > 1) {prime = false;}
else {prime = true;}
return prime;
};
};
答案 0 :(得分:2)
您原始代码中的一些问题:
快速解决上述问题:
var primetest = function(n){
var divisor = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var arr2 = [];
for (var i = 0; i < divisor.length; i++) {
if(n%divisor[i] == 0) {
arr2.push(i);
}
}
return arr2.length <=1;
}
优化的代码如果没有被重新使用,则不会遍历整个除数列表(猜测那是你想要实现的):
var primetest = function(n){
var divisor = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var arr2 = [];
for (var i = 0; i < divisor.length; i++) {
if(n % divisor[i] === 0) {
arr2.push(i);
if (arr2.length > 1)
return false;
}
}
return true;
};
答案 1 :(得分:0)
两个问题: 不要在循环中声明数组,因为它将在每个循环中重置。 并将你的返回移到循环之外,因为你的函数将在第一次循环时返回,对于奇数(n%2 = 0,偶数),它总是为真。
function primetest(n){
var divisor = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var arr2 = [];
for (var i = 0; i < divisor.length; i++) {
if((n%divisor[i]) === 0)
arr2.push(i);
if(arr2.length > 1)
prime = false;
else prime = true;
};
return prime;
}
$(function (){
var pprime = 7;
if(primetest(pprime))
alert("ok");
});
答案 2 :(得分:0)
将前1001个位置返回到素数数组。 有用的代码修改,享受!
//cum calculam daca un numar este prim
//chiar mai mult - care este al 1001-lea nr prim
function isPrime(num) {
if(num < 2) return false;
for (var i = 2; i < num; i++) {
if(num%i===0)
return false;
}
return true;
}
var shir=[];
var j=0;
var i=1;
while(j<1001)
{
if(isPrime(i))
{shir[j]=i;
j++;i++}
else{i++}
}
console.log(shir);
console.log (shir[0]);
console.log (shir[1000]);
alert("Al 1001-lea numar prim este " + shir[1000]);
答案 3 :(得分:-1)
你的病情
if(arr2.length > 1) {prime = false;}
正在检查>1
而不是>0
或>=1
,这会忽略您指定的主要条件。因此,您更正的代码将是这样的:
var primetest = function(n){
var divisor = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
for (var i = 0; i < divisor.length; i++) {
var arr2 = [];
if(n%divisor[i] == 0) {arr2.push(i);}
if(arr2.length > 0) {prime = false;}
else {prime = true;}
return prime;
};
};
if(arr2.length > 1) {prime = false;}
有更好的方法来检查素数。这是我能抓住的最快的一个:
var primetest = function(n) {
if (isNaN(n) || !isFinite(n) || n%1 || n<2) return false;
if (n==leastFactor(n)) return true;
return false;
}
// leastFactor(n)
// returns the smallest prime that divides n
// NaN if n is NaN or Infinity
// 0 if n=0
// 1 if n=1, n=-1, or n is not an integer
leastFactor = function(n){
if (isNaN(n) || !isFinite(n)) return NaN;
if (n==0) return 0;
if (n%1 || n*n<2) return 1;
if (n%2==0) return 2;
if (n%3==0) return 3;
if (n%5==0) return 5;
var m = Math.sqrt(n);
for (var i=7;i<=m;i+=30) {
if (n%i==0) return i;
if (n%(i+4)==0) return i+4;
if (n%(i+6)==0) return i+6;
if (n%(i+10)==0) return i+10;
if (n%(i+12)==0) return i+12;
if (n%(i+16)==0) return i+16;
if (n%(i+22)==0) return i+22;
if (n%(i+24)==0) return i+24;
}
return n;
}