【问题标题】:How to find prime numbers in entered number range [duplicate]如何在输入的数字范围内查找素数[重复]
【发布时间】:2014-03-14 18:27:57
【问题描述】:

我只是想找到输入的数字范围内的素数。我不知道如何计算找到素数。我需要将它们添加到数组中并在之后输出数组。我为计算放置了一个占位符......我似乎无法弄清楚如何找到素数。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">

<html>

    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />

        <title>LeapYears</title>

        <script type="text/javascript">
        /* <![CDATA[ */

        function calcPrimeNumber(){

                var beginNum = document.numbers.firstNum.value;
                var endNum = document.numbers.secondNum.value;
                var primeNumbs = new Array();


                var ctr = 0;
                while (beginNum <= endNum){ //throwaway
                    if ((beginNum % beginNum == 0) && (beginNum % 1 == 0)){
                        primeNumbs[ctr] = beginNum;
                        ++ctr;
                    }

                    ++beginNum;
                }

                if (primeNumbs == 0){
                    window.alert("There were no leap years within the range.");
                }

                else {
                    outputPrimeNums(primeNumbs);
                }

        }

        function outputPrimeNums(primes){
            document.write("<h2>Prime Numbers</h2>");
            for (i=0;i<primes.length;i++){
                    document.write(primes[i] + "<br/>");
                }

        }


        /* ]]> */
        </script>


    </head>


    <body>
        <form name="numbers">

            Beginning Number: <input type="text" name="firstNum" /> End Number: <input type="text" name="secondNum" /> 
            <input type="button" value="Find Prime Numbers" onclick="calcPrimeNumber()" />

        </form>

    </body>


</html>

【问题讨论】:

  • 如果输入范围内的质数不是从 0 开始,我该如何找到它?
  • @user3027217 你试过我的答案吗

标签: javascript arrays primes


【解决方案1】:

试试这个完整的素数页面

<html>

    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />

        <title>LeapYears</title>

        <script type="text/javascript">
        /* <![CDATA[ */

        function calcPrimeNumber(){

                var beginNum = parseInt(document.numbers.firstNum.value);
                var endNum = parseInt(document.numbers.secondNum.value);
                var primeNumbs = new Array();


                var ctr = beginNum;
                while(ctr<=endNum)
                {
                    if(isPrime(ctr)==true)
                    {
                        primeNumbs[primeNumbs.length] = ctr;
                    }
                    ctr = ctr+1;

                }

                if (primeNumbs.length == 0){
                   document.getElementById('output_content').innerHTML = "There were no prime no within the range.";
                }

                else {
                    outputPrimeNums(primeNumbs);
                }

        }

        function isPrime(num)
        {
            var flag = true;
            for(var i=2; i<=Math.ceil(num/2); i++)
            {
                if((num%i)==0)
                {
                    flag = false;
                    break;
                }
            }
            return flag;    
        }

        function outputPrimeNums(primes){
            var html = "<h2>Prime Numbers</h2>";
            for (i=0;i<primes.length;i++){
                    html += primes[i] + "<br/>";
                }
            document.getElementById('output_content').innerHTML = html;
        }


        /* ]]> */
        </script>


    </head>


    <body>
        <form name="numbers">

            Beginning Number: <input type="text" name="firstNum" /> End Number: <input type="text" name="secondNum" /> 
            <input type="button" value="Find Prime Numbers" onclick="calcPrimeNumber()" />

        </form>
        <div id="output_content">
        </div>
    </body>


</html>

【讨论】:

    【解决方案2】:

    我尝试从linked question 编辑Sieve of Atkin algorithm

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

    这将为您提供从minmax 的素数数组。它仍然需要遍历 2 中的所有数字,所以也许会有更有效的方法来实现这一点。

    【讨论】:

    • 这不是阿特金的筛子,而是埃拉托色尼的筛子。 :) j = i &lt;&lt; 1 位是 “将 i 乘以 2 的快速方法”,但它是从 i^2 开始工作的一种非常缓慢的方法。
    【解决方案3】:

    这里需要两个循环 - 第一个在 beginNumendNum 之间运行,第二个在 1 到 beginNum 之间运行 对于外部 beginNum 的每个值循环

    尝试将代码的主要部分替换为以下内容。 (为清楚起见,我将引入一个新变量 - numberBeingTested。)

    var ctr = 0;
    var numberBeingTested = beginNum;
    
    while (numberBeingTested <= endNum){ //throwaway
    
        var testDivisor = 2;
        var isPrime = true;
    
        while (testDivisor < numberBeingTested ){ //throwaway
            if (numberBeingTested % testDivisor == 0) {
                isPrime = false;
            }                    
    
        ++testDivisor;
        }
    
        if (isPrime){
            primeNumbs[ctr] = numberBeingTested;
            ++ctr;
        }
    
        ++numberBeingTested;
    }
    

    请注意,这里有许多可能的改进 - 首先,这段代码会告诉您 1 是素数,并且可能有显着的性能改进(例如测试可能的除数直到数字的平方根正在测试而不是数字本身)-但对于您的目的而言,它可能就足够了。

    【讨论】:

    • 谢谢,你说的很清楚了。
    【解决方案4】:

    您应该使用一些算法来检查给定的 no 是否在 while 循环中是素数。 http://en.wikipedia.org/wiki/Prime_number

    http://en.wikibooks.org/wiki/Efficient_Prime_Number_Generating_Algorithms

    【讨论】:

    • 那个wikibook页面是个坏建议,抱歉。 :) 那里的代码很糟糕,而且非常慢。它显示 100 万以下素数的时间为 5.6 秒,但this SO answer 最快平面 Python 代码的时间为 0.07 秒。没错,即使在不同的计算机上,速度快 80 倍也不少。
    • 这意味着您认为应该有人为这个简单的任务编写代码。检查给定的 no 是否为素数。您标记为答案的上述代码的运行时间是多少。
    • 我不是 OP,我不可能将答案标记为已接受。 :) 这只是 OP 要做的。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多