如何使用JavaScript计算素数?

时间:2015-06-27 21:13:01

标签: javascript

对于我在学校的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());

        }

2 个答案:

答案 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)

问题二

您的红利01都不是素数。在第一次分红为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无法被数字45整除,因此即使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. 如果一个数字是所有小于它的素数的共同素数,那么它就是素数。
  2. 如果一个数字与所有小于它的正方形的数字相同 root,那就是素数。
  3. 因此,您可以测试一个数字是否与所有小于其根的素数相同,以找出它是否为素数,并且您恰好已经计算了所有较小的素数

    1,100,80,23,44