首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将所有素数之和为一个数字:9返回true

将所有素数之和为一个数字:9返回true
EN

Stack Overflow用户
提问于 2017-09-02 14:39:48
回答 2查看 153关注 0票数 1

我目前正面临着这样的挑战:https://www.freecodecamp.org/challenges/sum-all-primes

我试图把所有素数从0加到10。

我有一个函数来检查这个数字是否是素数。如果我通过9,它会返回false,这很好。

但是,当我用while循环从10递减并将9传递到函数时,它似乎是返回true并将其添加到我的求和中。因此,当10中所有素数之和为17时,我得到了24的结果!这是因为它将9作为素数相加。

这是我的代码,我一定是漏掉了什么东西,但我能弄清楚!

代码语言:javascript
复制
function sumPrimes(num) {
  function isPrime() {
    for (var i = 2; i <= num; i++) {
      if (num % i === 0) {
        return false;
      }
      return num !== 1;
    }
  }
  // alert(isPrime(9)); // returns false
  var count = 0;
  while (num >= 0) {
    if (isPrime(num)) {
      count += num;
      console.log(count);
    }
    num--;
  }
  console.log(count);
}

sumPrimes(10);

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-02 14:46:37

首先,如果不小于num的数除以该数字,则需要从isPrime()返回true,因此从for循环中移除return num !== 1;,并在循环后添加return true。此外,您还在函数isPrime()中运行循环,直到数字num为止,因为每个数字都可以被自身整除,所以函数将对每个数字返回false,将循环条件更改为i<num。还请注意,1不是素数,所以您不需要在和中添加它。

代码语言:javascript
复制
function sumPrimes(num) {
function isPrime(num){
    if(num === 1 ) //since 1 is neither prime nor composite.
       return false;
    for (var i = 2; i < num; i++) {
        if (num % i === 0) {
            return false;
        }
    }
    return true;
}
// alert(isPrime(9)); // returns false
var count = 0;
while (num >= 0) {
    if (isPrime(num)) {
        count += num;
        alert(count);
    }
    num--;
}
console.log(count);
}

sumPrimes(10);

票数 1
EN

Stack Overflow用户

发布于 2017-09-02 14:46:36

尝试修改以下代码片段

代码语言:javascript
复制
function isPrime() {
    for (var i = 2; i <= Math.sqrt(num); i++) {
      if (num % i === 0) {return false;}
    }
    return true;
  }

使用Math.sqrt(num)作为上限将提高时间复杂度并加快大数字的计算速度(请参阅我的在线素数计算器,最多18位,通过一些附加优化:http://examn8.com/Primes.aspx )实现这个算法。

希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46014880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档