如何找到 0 - 100 之间的素数?

Posted

技术标签:

【中文标题】如何找到 0 - 100 之间的素数?【英文标题】:How to find prime numbers between 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 快速搜索发现了这个很棒的答案***.com/questions/9138872/… 【参考方案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。

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

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

【讨论】:

以上是关于如何找到 0 - 100 之间的素数?的主要内容,如果未能解决你的问题,请参考以下文章

写一个函数来判断素数

打印素数从1到100

java笔试题:判断一个3~100之间的所有的素数?

编程求出100到10000之间既是素数又是回文数的所有数~用c语言,急 在线等

1.求100-300间的所有素数,按每行10个数输出,并求出输出怎么做?

Java 实现1~100之间有多少个素数并输出所有素数