题目
求小于等于给定数值的质数之和。
只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。
给定的数不一定是质数。
如果你被卡住了,记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。
这是一些对你有帮助的资源:
For Loops
Array.push()
思路
- 看提示 是要用上 for循环,和 push函数;
- 先读懂题目,说实话我并不记得神马是质数(输入法都翻了好多页),请原谅一个高考数学只70多分的人;
- 看题目下方的验证:
还是不是很明白要做什么,我特意在纸上画了画
- 瞬间清晰了很多,思路是从i=2开始(毕竟最小的质数是2)一直循环到num;然后嵌套一个子循环,j 小于< i;当i %j = 0 说明i 除了1和本身还有数能除进,则当前的j 不是质数,需要从判断的数 中减掉;
- 不过还是想到一个问题,因为如果num 足够大,i <= num 的for循环可能会超时?
- 暂时还想不到其他的好的解法,先写一个出来
解答
function sumPrimes(num) {
var i=2; //因为最小的质数是2,所以初始值设定为2;
var arr = 0; //定义一个变量来记录质数相加的和
if (num <=2 ){ // 如果num 小于等于2,则直接结束;
arr = 0;
}
while (i<=num){ //开始循环
for (var j=2;j<i;j++){
if(i%j === 0){ //开始子循环,判断小于i且大于2的 的数字是否都能被i整除
arr -= i; // 如果能被整除,说明i不是质数,需减掉
break; //循环结束
}
}
arr += i; //将是质数的i 加入到结果变量
i++;
}
return arr;
}
sumPrimes(10);
- 经验证,脚本OK;
- 不过仍然有担心比如 num过大会报错,经验证num 大于8600时就会报错:
as the first line. Beware that if you do have an infinite loop in your code this will crash your browser.
- 再找找看有无更高效的算法;