【问题标题】:Javascript: find first n prime numbersJavascript:查找前 n 个素数
【发布时间】:2013-06-29 16:12:28
【问题描述】:
function primeNumbers(n) {
    array = [];
    for (var i = 2; array.length < n; i++) {
        for (var count = 2; count < i; count++) {
            var divisorFound = false;
            if (i % count === 0) {
                divisorFound = true;
                break;
            }
        }
        if (divisorFound == false) {array.push[i];}
    }
    return array;
}

当我运行这段代码时,它似乎陷入了一个无限循环并且没有返回任何东西......为什么?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    尝试将此行放在第二个循环之前:

    var divisorFound = false;
    

    让这一行可以访问它:

    if (divisorFound == false) {array.push(i);}
    

    注意 NPE 所说的 FIXED array.push(i)。 :)

    您可能想了解 JavaScript 中的 Variable Scope

    【讨论】:

    • 谢谢,把行 var divisorFound = false;在第二个循环解决了我的另一个问题之前,该函数正在生成第二个到 n+1 个素数而不是第一个 n 个素数。是否也可以以逗号而不是换行符分隔的方式添加素数?
    【解决方案2】:

    在您的代码中,array.push[i](带方括号)不会按照您的意愿行事。它使数组保持不变并返回undefined

    您的意思是array.push(i)(带括号)。

    【讨论】:

      【解决方案3】:

      这不是最先进的方法。使用筛子会更好。然而,这是相当不错的,并且为处理素数代码挑战提供了一个很好的起点。

      /*
       * Get the first n prime numbers
       *
       * @param n Number (integer)
       * @return Array
       *
       */
      function getNprimes(n){
        const arr = [];
        let i = 2
      
        while (arr.length < n) {
          if (isPrime(i)) {
            arr.push(i)
          }
          i++
        } 
        return arr;
      
        /*
        * @param n (integer)
        * @return Boolean
        *
        */
        function isPrime(n) {
      
          if ( n < 2 ) {
            return false
          }
      
          for ( let i = 2; i <= Math.sqrt(n); i++ ) {
            if ( n % i === 0 ) {
                return false;
            } 
          }
          return true
        }
      
      }
      

      【讨论】:

        【解决方案4】:

        此外,您永远不会为 array 定义长度,因此 for 循环无法知道何时停止。

        【讨论】:

          【解决方案5】:

          如果你只检查它的 sqrt(n),实际上要找到 n 个素数,它会更优化 [o(n*sqrt(m))]。如果它不能被 n 的平方根整除,那么它也不能被 n 整除。 这是一个例子:

          (function(n){
          var primes=[];
              for (var i=1;i<n;i++){
                  var prime=true;
                  var rootI=Math.sqrt(i)+1;
                  for (var j=2;j<rootI;j++){
                      if (i%j==0) {prime=false;break;}
                  };
                  if (prime) primes.push(i);
              }
              document.write(primes.join('-'));
          })(100000)

          【讨论】:

          • 1 不是素数
          【解决方案6】:
          <script>
              // first n prime numbers
             function checkPrime(number){
                  let temp=2;
                  while(temp<number){
                    if(number%temp == 0){
                        return false;
                    }
                    temp++;
                  } 
               return true;
             }
             function firstnPrime(number){
                  var count=0;
              for(var i=2;i<=number;i++){
                   if(checkPrime(i)){
                       count++;
                   }
              }
                  return count;
             }
          
          
             console.log(firstnPrime(100));
          
              </script>
          

          【讨论】:

          • 请在您的回答中添加一些解释。
          【解决方案7】:

          imana97 answare 不正确,因为“1”不是质数,而“2”是质数。而且它们不是前n个数字,而是小于n的质数。

          所以,我更正的版本是:

          (function(n){
          var primes=[2];
              for (var i=2;primes.length<n;i++){
                  var prime=true;
                  var rootI=Math.sqrt(i)+1;
                  for (var j=2;j<rootI;j++){
                      if (i%j==0) {prime=false;break;}
                  };
                  if (prime) primes.push(i);
              }
              document.write(primes.join('-'));
          })(10000)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-22
            • 2023-03-09
            • 2010-12-10
            • 1970-01-01
            • 2015-12-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多