如何找到 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 -<<
运算符将左操作数左移一位(必要时将其转换为整数值之后)。这只是乘以 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】:首先,将您的内部代码更改为另一个循环(for
和 while
),以便您可以针对不同的值重复相同的代码。
更具体地解决您的问题,如果您想知道给定的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 之间的素数?的主要内容,如果未能解决你的问题,请参考以下文章
编程求出100到10000之间既是素数又是回文数的所有数~用c语言,急 在线等