【问题标题】:How to find prime numbers between 0 - 100?如何找到 0 - 100 之间的素数?
【发布时间】:2012-08-11 14:01:00
【问题描述】:

在 Javascript 中,我如何找到 0 到 100 之间的素数?我已经考虑过了,但我不知道如何找到它们。我想过做 x % x 但我发现了明显的问题。 这是我到目前为止所拥有的: 但不幸的是,这是有史以来最糟糕的代码。

var prime = function (){
var num;
for (num = 0; num < 101; num++){
    if (num % 2 === 0){
        break;
    }
    else if (num % 3 === 0){
        break;
    }
    else if (num % 4=== 0){
        break;
    }
    else if (num % 5 === 0){
        break;
    }
    else if (num % 6 === 0){
        break;
    }
    else if (num % 7 === 0){
        break;
    }
    else if (num % 8 === 0){
        break;
    }
    else if (num % 9 === 0){
        break;
    }
    else if (num % 10 === 0){
        break;
    }
    else if (num % 11 === 0){
        break;
    }
    else if (num % 12 === 0){
        break;
    }
    else {
        return num;
    }
}
};
console.log(prime());

【问题讨论】:

  • Java 还是 JavaScript?由于var===,该代码看起来像JavaScript。 JavaScript 与 Java 完全不同。
  • 如果它只能在 0 到 100 之间,最好只找到一个素数列表并将它们组成一个数组。然后,检查indexOf(number) == -1
  • 快速搜索发现了这个很棒的答案stackoverflow.com/questions/9138872/…

标签: javascript math primes


【解决方案1】:

使用以下函数找出素数:

function primeNumbers() {
    var p
    var n = document.primeForm.primeText.value
    var d
    var x
    var prime
    var displayAll = 2 + " "
    for (p = 3; p <= n; p = p + 2) {
        x = Math.sqrt(p)
        prime = 1
        for (d = 3; prime && (d <= x); d = d + 2)
        if ((p % d) == 0) prime = 0
        else prime = 1
        if (prime == 1) {
            displayAll = displayAll + p + " "
        }
    }
    document.primeForm.primeArea.value = displayAll
}

【讨论】:

    【解决方案2】:

    使用递归结合here 的平方根规则,检查一个数是否为素数:

    function isPrime(num){
    
        // An integer is prime if it is not divisible by any prime less than or equal to its square root
        var squareRoot = parseInt(Math.sqrt(num));
        var primeCountUp = function(divisor){
            if(divisor > squareRoot) {
                // got to a point where the divisor is greater than 
                // the square root, therefore it is prime
                return true;
            }
            else if(num % divisor === 0) {
                // found a result that divides evenly, NOT prime
                return false;
            }
            else {
                // keep counting
                return primeCountUp(++divisor);
            }
        };
    
        // start @ 2 because everything is divisible by 1
        return primeCountUp(2);
    
    }
    

    【讨论】:

      【解决方案3】:
      <code>
      <script language="javascript">
         var n=prompt("Enter User Value")
           var x=1;
             if(n==0 || n==1) x=0;
                for(i=2;i<n;i++)
                 {
                if(n%i==0)
             {
           x=0;
           break;
             }
                 }
                 if(x==1)
                   {
                      alert(n +" "+" is prime");
                   }
                   else
                   {
                      alert(n +" "+" is not prime");
                   }
      
      
                </script>
      

      【讨论】:

        【解决方案4】:
        <html>
        <head>
        <script type="text/javascript">
        function primeNumber() {
         x=document.getElementById('txt_field').value;
          for (i=1; i<=parseInt(x); i++) {
          var flag=0,flag1=0; 
            for (j=2; j<i; j++) {
              if(i%j==0){
               flag=1;
              if(i==x)
               flag1=1;
              }
            }
           if(flag==0)
            document.write(i+'<br>');
          }
           if(flag1==0) 
            document.write('Its a prime number.');
           else 
            document.write('Its not a prime number.');
        }
        </script>
        </head>
        
        <body>
         <input id="txt_field" type="text" name="field" />
         <input type="button" name="submit" value="Submit" onclick="primeNumber();" />
        </body>
        </html>
        

        【讨论】:

          【解决方案5】:

          这是一个用 JavaScript 实现筛子的例子:

          function getPrimes(max) {
              var sieve = [], i, j, primes = [];
              for (i = 2; i <= max; ++i) {
                  if (!sieve[i]) {
                      // i has not been marked -- it is prime
                      primes.push(i);
                      for (j = i << 1; j <= max; j += i) {
                          sieve[j] = true;
                      }
                  }
              }
              return primes;
          }
          

          然后getPrimes(100) 将返回一个包含 2 到 100(含)之间所有素数的数组。当然,由于内存限制,您不能将其与大参数一起使用。

          Java 实现看起来非常相似。

          【讨论】:

          • 很好——你能解释一下 j for 循环吗?我找不到关于“
          • @BubblewareTechnology - &lt;&lt; 运算符将左操作数左移一位(必要时将其转换为整数值之后)。这只是乘以 2 的一种快速方法。对于 i 的所有倍数,内部循环只是将 sieve[j] 设置为 true。这样做的原因是i 的倍数不能是素数。
          • 算法的复杂度更高:O(n^2),其中 埃拉托色尼筛法 的复杂度为 O(n)
          • @OmShankar 为什么是n^2?根据this answer(和this comment there),它应该是通常的n*log log n(不是O(n)顺便说一句)。
          • @caub - 这是一个清晰的问题(在我看来,这会影响可维护性)。将 sieve 声明为一个数组表示值正在通过数字索引进行存储和检索。维护者(可能希望修改代码以使用sieve 做其他事情)会知道sieve.length 和数组方法可供使用。至于最优性,如果一个对象在这里的表现明显优于数组,我会感到惊讶。事实上,数组可能更快(例如,请参阅here)。
          【解决方案6】:

          如果您要使用本线程中将介绍的任何海量算法,那么您应该学习记忆其中的一些算法。

          Interview question : What is the fastest way to generate prime number recursively?

          【讨论】:

            【解决方案7】:

            首先,将您的内部代码更改为另一个循环(forwhile),以便您可以针对不同的值重复相同的代码。

            更具体地解决您的问题,如果您想知道给定的n 是否为素数,则需要将其除以 2 和 sqrt(n) 之间的所有值。如果任何一个模块为 0,则它不是素数。

            如果你想找到所有的素数,你可以加快速度并检查n,只需除以之前找到的素数。加快处理速度的另一种方法是,除了 2 和 3,所有素数都是 6*k 加或小于 1。

            【讨论】:

            • 其实在2到sqrt(n)之间。
            • 是的,你是对的。如果大于 sqrt(n) 的数是 n 的除数,则意味着它的商小于 sqrt(n),所以它已经被找到了。更正。
            【解决方案8】:

            这里是这个脚本的现场演示:http://jsfiddle.net/K2QJp/

            首先,创建一个函数来测试单个数字是否为素数。如果你想扩展 Number 对象,你可以,但我决定让代码尽可能简单。

            function isPrime(num) {
                if(num < 2) return false;
                for (var i = 2; i < num; i++) {
                    if(num%i==0)
                        return false;
                }
                return true;
            }
            

            此脚本遍历比该数字小 2 到 1 之间的每个数字,并测试如果您将该数字除以增量,是否有任何数字没有余数。如果有任何没有余数,它就不是素数。如果该数小于 2,则它不是质数。否则,它是素数。

            然后创建一个 for 循环来遍历数字 0 到 100 并使用该函数测试每个数字。如果是素数,则将数字输出到日志中。

            for(var i = 0; i < 100; i++){
                if(isPrime(i)) console.log(i);
            }
            

            【讨论】:

            • @argshook 想发表这个评论,但他的代表太低了,所以我代表他们添加它。 “isPrime() 不应该循环检查 num % i !== 0 而不是 num % i == 0?”
            • @Mike - 我不知道你为什么这么说。我验证了输出并正确记录。对于不需要使用控制台窗口的版本,请查看here。 @Gray / @argshook - 该行用于检查 num 是否可被 i 或我们正在检查的当前数字整除。如果它可以被任何小于当前数的数整除,我们返回false,这意味着它不是质数。
            • @EvanKennedy:抱歉,你不得不为此责怪控制台。你的 sn-p 答案 // for(var i = 0; i
            • 你提出的代码没有优化,i必须停在sqrt(num)
            • 为什么我们检查到最后一个数字,如果我们检查到中间,我们会降低时间复杂度.. for (var i = 2; i
            【解决方案9】:

            Luchian 的回答为您提供了找到素数的标准技术的链接。

            一种效率较低但更简单的方法是将现有代码转换为嵌套循环。观察你正在除以 2,3,4,5,6 等等……然后把它变成一个循环。

            鉴于这是作业,并且作业的目的是帮助您学习基本编程,一个简单、正确但效率稍低的解决方案应该没问题。

            【讨论】:

              【解决方案10】:

              无论使用哪种语言,在一个范围内查找素数的最佳且最容易使用的方法之一是使用 sieve

              不会给你代码,但这是一个很好的起点。

              对于像您这样的小范围,最有效的方法是预先计算数字。

              【讨论】:

                猜你喜欢
                • 2016-04-08
                • 1970-01-01
                • 1970-01-01
                • 2018-10-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多