【问题标题】:Finding all Prime Numbers less than an input查找小于输入的所有素数
【发布时间】:2014-07-21 12:22:44
【问题描述】:

我有一个input field 来获取最大数字并找到所有较小的素数

它应该返回array 并显示arrayalert

除了我每次都变得空白。

HTML:

<p>Please enter the maximum number you'd like to find all prime numbers below it for.</p>
<p><input type="text" id="number" /></p>
<button id="run">RUN</button>

CSS:

#go, #number {float:left;}

JavaScript:

var primes=[];
function isPrime(x){
    var prime=true;
    for(var i=0;i<=Math.sqrt(x);i++){
        if(x%i===0){
            prime=false;
        }
    }
    if(prime){
        primes.push(x);
    }
};
$('#run').on('click',function(){
    var total=$('#number').val();
    for(var j=2;j<=total;j++){
        isPrime(j);
    }
    alert(primes);
});

http://jsfiddle.net/jH5jq/1/

【问题讨论】:

  • 为什么所有的仇恨都投反对票...?只是因为我想通了并回答了我自己的问题?认为这可能对将来搜索它的人有用...
  • SO 社区总是对他人咄咄逼人……也许是因为问题只是数学错误?
  • @NicholasHazel 一般来说,我会避免在没有 cmets 的情况下投反对票。如果投反对票的人真的想通过消除噪音来改善网站 - 他应该评论他投反对票的为什么,这样其他人就不会重蹈覆辙。显然,正如你所看到的 - 没有人写评论。所以 - 忽略它。你的问题没有错。 (也 - 我坚持 Derek 的评论)

标签: javascript jquery primes


【解决方案1】:

这就是问题所在:

for(var i=0;i<=Math.sqrt(x);i++){

当然它会被1整除。

修改后的working jsfiddle

JavaScript:

var primes=[];
function isPrime(x){
    var prime=true;
    for(var i=2;i<=Math.sqrt(x);i++){
        if(x%i===0){
            prime=false;
        }
    }
    if(prime){
        primes.push(x);
    }
};
$('#run').on('click',function(){
    var total=$('#number').val();
    for(var j=3;j<=total;j++){
        isPrime(j);
    }
    alert(primes);
    primes=[];
});

【讨论】:

    【解决方案2】:

    可以并且应该在最初发布的代码中进行一些改进:

    需要满足共同的专业标准:

    • 一个叫做“isPrime(x)”的东西应该返回一个布尔值

    在我看来不错的功能

    • 在页面上显示输出而不是警报
    • 使用素数列表来检查未知数,而不是检查每个整数的可分性
    • 存储素数列表并在按钮按下之间重复使用以加快额外使用速度
    • 将素数列表存储在浏览器存储中以加快未来使用速度

    HTML -- 添加了一个 div 来包含答案

    <p>Please enter the maximum number you'd like to find all prime numbers below it for.</p>
    <p><input type="text" id="number" /></p>
    <button id="run">RUN</button>
    <br/>
    <div id="answer"></div>
    

    JS -- 将 isPrime 更改为返回布尔值,添加 findPrimes 以返回一个数组,以及上面提到的其他功能

    // try to grab our prime list out of browser localstorage
    try {
        window.primes = JSON.parse(window.localStorage["primes"]);
        console.log("retrieved "+window.primes.length+" primes from storage");
        // print the seed primes to the console in case of bug
        console.log(window.primes); 
    } catch(e){};
    
    // seed it with a few primes if empty
    if (typeof(window.primes)!=="object") window.primes=[2,3,5,7];  
    
    function isPrime(x){
        // isPrime takes x and returns a Boolean if x is Prime
        var prime=false, i=0,l=primes.length;
        var maxprime=primes[l-1];
        var reqprime = Math.floor(Math.sqrt(x));
        if (reqprime>maxprime) {
          findPrimes(reqprime);
          // the primes list has changed, set l again
          l = primes.length;
        }
        while( (i<l) && (x%primes[i]!==0) && (primes[i]<=reqprime) ) ++i;
        prime = ( (i===l)  || (primes[i]>reqprime) ); 
        // if i is l then x is prime
        // if we have checked all the primes up to sqrt(x) then x is prime
        return prime
    };
    
    function findPrimes(x){
        // findPrimes finds new primes up to and including x
        // returns an Array of prime numbers
        var i=0,result=[],l=primes.length;
        var maxprime=primes[l-1];
        if (x>maxprime){ 
            for(i=maxprime+2; i<=x; i+=2){
                if (isPrime(i)) primes.push(i);
            }
            l=primes.length;
            // try to set browser localstorage with new list of Primes
            // fail with console message only
            try {
                window.localStorage["primes"]=JSON.stringify(primes);
            } catch(e){ console.log("cant set primes in localStorage"); };
        }
        i=0;
        while( (i<l) && (primes[i]<=x)){
            result.push(primes[i]);
            ++i;
        }
        return result;
    }
    
    $('#run').on('click',function(){
        var total=$('#number').val();
        var answer = findPrimes(total);
        $('#answer').html("<ul><li>"+
                          answer.join("</li><li>")+
                          "</li></ul>"
                          );
    });
    

    JSFIDDLE

    【讨论】:

    • 这里的目标是获得专业认可的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多