如何在输入的数字范围内查找素数

时间:2014-02-15 09:10:14

标签: javascript arrays primes

我只是想找到输入数字范围的素数。我不知道如何计算寻找素数。我需要将它们添加到数组并输出数组。我把一个占位符用于计算......我似乎无法弄清楚如何找到素数。

<!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>

4 个答案:

答案 0 :(得分:0)

你应该使用一些算法来检查给定的no是否为prime而不是while循环。 http://en.wikipedia.org/wiki/Prime_number

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

答案 1 :(得分:0)

这里需要两个循环 - 第一个在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是素数,并且有很大的性能改进(例如测试可能的除数,直到数字的平方根)正在测试而不是数字本身) - 但为了您的目的,它可能就足够了。

答案 2 :(得分:0)

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

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的所有数字,所以可能会有更有效的方法来实现这一点。

答案 3 :(得分:0)

尝试这个素数无实例的整页

<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>