对于我在学校的JavaScript课程,我的任务是计算前10个素数。指令明确指出不使用数组来存储它们,否则赋值将导致零。我以为我的逻辑已经解决了,但也许没有。下面的代码导致3,4,5,5,5,6,6,7,7,7,7,7
非常明显,它不正确,因为4和6不是素数,也有重复。此外,当需求为10时,它输出12个数字。出了什么问题?
function primeNumbers(){
var primeNumbers = []; /* Where the prime numbers are stored */
for(var dividend = 0; primeNumbers.length <= 10; dividend++){
for(var divisor = 0; divisor <= dividend; divisor++){
if(dividend % divisor > 0){
primeNumbers.push(dividend);
}
}
}
console.log(primeNumbers.join());
}
答案 0 :(得分:4)
重复是因为您没有突破中间for
循环:
for(var divisor = 0; divisor <= dividend; divisor++){
if(dividend % divisor > 0){
primeNumbers.push(dividend);
// add this line:
break;
}
}
而不是divisor <= dividend
你可以考虑一些轻微的优化(这样你必须测试更少的可能性):
divisor <= (dividend/2)
或更好:
divisor <= Math.sqrt(dividend)
您的红利:0
和1
都不是素数。在第一次分红为2
的情况下开始初始性测试并不是作弊。
你的除数:1
可以对所有内容进行整除,0
不能对任何内容进行整除。它们与素性无关,因此将它们从for循环中排除,并从2
开始。
仅仅因为dividend % divisor > 0
对于一个divisor
是正确的,不会使dividend
成为素数:对于所有divisor
,它都必须为真。我会在我的for循环之外添加一个isprime
变量并更改条件(找到数字肯定不是素数的时候):
var isprime = true;
for(var divisor = 2; divisor <= root; divisor++){
if(dividend % divisor == 0){
isprime = false;
break;
}
}
function primeNumbers(){
var primeNumbers = []; /* Where the prime numbers are stored */
for(var dividend = 2; primeNumbers.length < 10; dividend++){
var root = Math.sqrt(dividend);
var isprime = true;
for(var divisor = 2; divisor <= root; divisor++){
if(dividend % divisor == 0){
isprime = false;
break;
}
}
if (isprime)
primeNumbers.push(dividend);
}
alert(primeNumbers.join());
}
primeNumbers()
答案 1 :(得分:1)
你得到重复,因为每当你证明它不能被某些数字整除而不是等待每个数字的证明时,你就会认为它是重要的。这与您获得误报的原因相同,即在您的函数
中4
无法被3
整除,因此即使4
可被2
整除,它也会被添加到您的列表中一次5
无法被数字2
整除为4
,因此您可以3
次出现6
无法被数字4
和5
整除,因此即使2
可以被2
整除,也会3
出现7
次}}和2
6
无法被数字5
整除为function primeNumbers() {
var primeNumbers = [], /* Where the prime numbers are stored */
candidate = 1, // because I'm ++ing it in the loop we really start at 2
root,
i;
main: while (primeNumbers.length <= 10) {
++candidate;
root = Math.sqrt(candidate);
for (i = 0; i < primeNumbers.length && primeNumbers[i] <= root; ++i)
if (candidate % primeNumbers[i] === 0)
continue main; // this isn't a prime, so skip to next candidate
// if we reach here then the candidate is prime
primeNumbers.push(candidate);
}
console.log(primeNumbers);
}
primeNumbers(); // logs [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
,因此您可以1,23,44
1,20,15
1,50,45
1,30,20
次出现为避免这种情况,您只需在每次测试成功后添加到列表中,或者另一种思考方式是在第一次失败后丢弃该号码
当您保留所有以前素数的目录时,您只需查看以前的素数即可执行更快的测试,即
因此,您可以测试一个数字是否与所有小于其根的素数相同,以找出它是否为素数,并且您恰好已经计算了所有较小的素数
1,100,80,23,44