我正在尝试编写一个JavaScript素数生成器,列出1到100之间的每个素数。我知道这是一个常见的编程练习,网上有很多解决方案。我的问题是为什么我的解决方案导致空数组?这是代码:
var primeNumbers = [];
for (var x=2; x<101; x++)
if (x%2 === 0)
{
break;
}
else
{
for (var y=2; y<101; y++)
{
if (x/y > 1)
{
break;
}
else
{
primeNumbers.push(x);
}
}
}
};
console.log(primeNumbers);
答案 0 :(得分:4)
因为你要做的第一件事是x % 2 === 0
。这是真的。 break
将退出循环。我想你想要continue
。
答案 1 :(得分:2)
问题1:您在x%2 === 0
时中断,因此您立即退出循环。反转条件并直接在循环中输入代码:
替换它:
if (x%2 === 0) {
break;
}
else {
使用:
if (x%2 !== 0) {
问题2:如果x/y > 1
,您正在退出内循环。这与条件x > y
相同,因此将始终立即退出内循环。相反,使内循环从两个向上运行,最小为x
:
for (var y=2; y<x; y++) {
问题3:您应该使用模运算符x
,而不是将y
除以x%y
并与之比较。如果结果为零,则x
不是素数。
问题4:您在内部循环中添加素数,因此您将多次使用大多数数字,而不只是素数一次。
您需要添加一个变量来跟踪内循环中发生的事情。如果内循环中的检查的 none 为零,则可以将x
添加到素数列表中。
答案 2 :(得分:1)
您不必在限制之前测试每个数字,您只需要测试在该数字之前找到的素数。 如果您要查找1到10之间的所有素数,例如当您测试7时,您应该测试
7%2 === 0 false
7%3 === 0 false
7%5 === 0 false
是7是素数,而素数数组应该是
[0,1,2,3,5,7]
如你所见,我没有测试4因为4不是素数。这是你要测试的数字8
8%2 === 0 true > return false
并且您不必测试更多,因为您已经知道它不是素数。所以最终的解决方案应该是
function getPrimes(x){
var ar = [];
for (var counter = 0; counter <= x; counter++) {
var notPrime = false;
for (var i = 2; i <= ar.length && !notPrime; i++) {
if (counter%ar[i]===0) {
notPrime = true;
}
}
if (notPrime === false) ar.push(counter);
}
console.log(ar)
}
getPrimes(250);
答案 3 :(得分:0)
var funPrimeNumber=function(val){
var iniX=2;
var iniY=2;
var flag=1;
while(iniX<val){
iniY=2;
flag=1;
while(iniY<iniX){
if(iniX%iniY==0){
//NOT PRIME NUMBER
flag=0;
}
iniY++;
}
if(flag==1){
//PRIME NUMBER
document.write(iniX + ", ");
}
iniX++;
}
}
funPrimeNumber(100);