0

我正在尝试编写一个返回 PrimeNumber 的函数。出于测试目的,我只是为这个功能的各个阶段做一个 console.log,以尝试更好地理解它。所以我的总函数中的这一行(行:18)将只返回 i; 而不是做一个console.log所以基本上,30将被传递给函数,函数将返回每个质数<=30。

它基于来自wiki的内容:该例程包括将 n 除以每个大于 1 且小于或等于 n 的平方根的整数 m。如果任何这些除法的结果是整数,则 n 不是素数,否则它是素数。

(这里的问题:25/Math.sqrt(25) = 0,因此 NotPrime BUT 25/2=12.5, 25/3=8.3333 25/4=6.25 => IsPrime 因为 12.5 不是整数或者我在这里遗漏了什么? ??)

还有重复的问题: 13 打印了两次,因为 13/2 和 13/3 被执行了。这里的问题:我也想修复这个重复?

function isInt(n) {
   return n % 1 === 0;
}

var test = 25
console.log(Math.sqrt(test));

function prime(n) {
for(var i = 1; i <= n; i++) 
{   if(i%2 !==0 && i%3 !==0){ // if i/2 does not have a remainder it might be a prime so go to next line else jump 

to next number and i%3 the same 
        var a = Math.floor(Math.sqrt(i));
        for(j = 2; j<=a; j++){ 

            console.log(i + "/" + j); //print j//it prints 9 twice and 10 twice 
            console.log("==" + i/j);                    //because the sqrt of 9 = 3 => 

for j= 2 and j=3 
            if(isInt(i/j)) {}
            else{console.log("----"  + i + "is Prime");}
        }
    }
}
};

prime(test);

此处使用稍微不同的方法的另一个示例:但我再次遇到与上述 25 相同的问题和重复

var test = 25
console.log(Math.sqrt(test));

for(var i = 1; i <= test; i++) 
{   if(i%2 !==0 && i%3 !==0){ // if i/2 does not have a remainder it might be a prime so go to next line else jump to next number and i%3 the same 
        var a = Math.floor(Math.sqrt(i));
        for(j = 2; j<=a; j++){ 

            console.log(i + "%" + j); //print j//it prints 9 twice and 10 twice 
            console.log("==" + i%j);                    //because the sqrt of 9 = 3 => for j= 2 and j=3 
            if(i%j !==0) {
                console.log("----"  + i + "is Prime");

            }
        }
    }
}

[编辑]非常感谢大家指出我的缺陷/错误,这是我的工作示例。再次感谢大家!!

function isInt(n) {
   return n % 1 === 0;
}

var test = 100
console.log(Math.sqrt(test));

function prime(n) {
    for (var i = 1; i <= n; i++) {
        var a = Math.floor(Math.sqrt(i));
        var bool = true;
        for(j = 2; j<=a; j++) { 

            if(!isInt(i/j)) {
                //console.log(i+"/"+j+"=="+i/j+", therefore "+i+" is Prime");
            } else {bool = false;}
        }
        if(bool) {console.log(i+"/"+j+"=="+i/j+", therefore "+i+" is Prime");}
    }
}
prime(test);
4

1 回答 1

0

25/Math.sqrt(25) = 0,因此不是素数

但是 25/2=12.5, 25/3=8.3333 25/4=6.25 => IsPrime

不。只是因为它不能被 2、3 和 4 整除,这并不意味着 25 是质数。它必须不能被任何东西整除(除了 1 和它本身)——但正如你所注意到的,25 可以被 5 整除。您还必须对此进行检查。

13 被打印两次,因为 13/2 和 13/3 被执行。

这里的问题:我也想修复这个重复?

你的逻辑有缺陷。如上所述,仅仅因为一个数字不能被另一个数字整除并不意味着它是素数 - 但您的代码会根据该条件打印结果。相反,它必须不能被所有其他数字整除。

你只是有一个额外的条件,即没有任何东西可以被 2 或 3 整除,但所有可以被 5、7、11 等整除的东西(不能被 2 或 3 整除)都会产生。25 只是该系列中出现的第一个数字,接下来是 35 和 49。

实际上,您已经在循环中测试了 2 和 3 2a因此您应该忽略该条件。如果您尝试过,您会更快地注意到您的实际问题:

function prime(n) {
    for (var i = 1; i <= n; i++) {
        var a = Math.floor(Math.sqrt(i));
        for(j = 2; j<=a; j++) { 
            if(!isInt(i/j)) {
                console.log(i+"/"+j+"=="+i/j+", therefore "+i+" is Prime");
            }
        }
    }
}
prime(25);

逻辑应该是:测试从2to 的所有除数sqrt(i),如果i可以被其中的任何一个整除,您就知道它不是素数。只有当它通过循环并且它们都不是 的因数时i,你才知道它是质数我会把它作为练习留给你:-)

于 2013-07-01T23:35:17.377 回答