代码错误地将许多非素数计算为素数,我不确定为什么。基本上输出交替输入“prime”和“not prime”。
#!/usr/bin/env node
for (var i = 3; i <= 30; i++) {
console.log(i + ": " + isPrime(i) + " ");
}
function isPrime(num) {
var counter;
for (counter = 2; counter < num; counter++) {
if(num % counter == 0) {
return "not prime";
}
else {
return "prime";
}
}
}
答案 0 :(得分:0)
num%2是num mod 2,这意味着除以2之后的数字的剩余部分。
你真正想做的是这样的事情:
primes = [2]
for (var i=0;i<primes.length;i++){
if (primes[i]<sqrt(num)){
if (num % primes[i] == 0){
console.log("Not prime!");}
}
else{
console.log("prime!");
primes.push(num);
}
}
当你确定素数时,你应该只是试图构建你正在检查的数字的素数因子分解,否则你做的工作比你应该做的更多。由于素数因子分解是由素数构成的,因此这些是你应该检查模数的唯一数字。
此外,您应该只检查数字的平方根,因为任何可被整除的数字都将具有匹配的数字。例子:
104 = 57*2
39 = 13*3
复杂度从O(n)到O(log(sqrt(n)),这是4次比较,而不是100,即使只有100的n,它也会越来越好。
答案 1 :(得分:0)
for (var i = 3; i <= 30; i++) {
console.log(i + ": " + isPrime(i) + " ");
}
function isPrime(num) {
var counter;
for (counter = 2; counter < num; counter++) {
if(num % counter == 0) {
return "not prime";
}
}
// only return that it is prime if it is not evenly
// divisible by all numbers less than it
// (technically you only need to check up to sqrt(num) + 1)
return "prime";
}
答案 2 :(得分:0)
你需要在循环之后返回true,而不是在循环内部。例如,如果(9%2 == 0)则返回第一次迭代次数。否则返回素数。但九不是素数。只有在通过迭代后才返回true,你会找到预期的结果。
function isPrime(num) {
var counter;
for (counter = 2; counter < num; counter++) {
if(num % counter == 0) {
return " not prime";
}
}
return " prime";
}
答案 3 :(得分:0)
在完成循环检查后,你必须返回素数
for (var i = 3; i <= 30; i++) {
console.log(i + ": " + isPrime(i) + " ");
}
function isPrime(num) {
var counter;
for (counter = 2; counter < num; counter++) {
if(num % counter == 0) {
return "not prime";
}
}
return "prime";
}
答案 4 :(得分:-1)
第一次出现错过f(num % counter == 0)
条件的情况时,它将返回非素数
从你的for-loop
中取出return "prime";
电话的最简单方法
function isPrime(num) {
for(counter = 2; counter < num; counter++) {
if(num % counter == 0) {
return "not prime";
}
}
return "prime";
}