Javascript 编程查找一个数是否为素数
我正在使用JavaScript编写一段代码来检查一个数字是否为素数。代码正确地告诉我number=1,2,3的结果,但在某些其他情况下(如10)失败。我不知道是什么问题导致它只在某些数字上失败。如果有人能帮助确定问题并提出解决方案,我将不胜感激Javascript 编程查找一个数是否为素数,javascript,html,if-statement,for-loop,primes,Javascript,Html,If Statement,For Loop,Primes,我正在使用JavaScript编写一段代码来检查一个数字是否为素数。代码正确地告诉我number=1,2,3的结果,但在某些其他情况下(如10)失败。我不知道是什么问题导致它只在某些数字上失败。如果有人能帮助确定问题并提出解决方案,我将不胜感激 if (total < 2) {var prime = "this is not a prime number"} if (total == 2) {prime = "this is a prime number"} if (total == 3)
if (total < 2) {var prime = "this is not a prime number"}
if (total == 2) {prime = "this is a prime number"}
if (total == 3) {prime = "this is a prime number"}
for (var l = 2; l <= Math.sqrt(total); l++) {
if (total % l == 0) {prime = "this is not a prime number"}
else {prime = "this is a prime number"}
}
if(total<2){var prime=“这不是质数”}
如果(total==2){prime=“这是一个素数”}
如果(total==3){prime=“这是一个质数”}
for(var l=2;l首先,对于素数,您不需要检查偶数(2,4,6等),因此for循环可以从3开始,l=l+2
其次,你的函数是如何失败的?似乎你应该记住状态,如果它不是素数,就中断循环(或者如果是素数,就不知道你想要什么)
此外,您还可以通过将for循环设置为所需数量的一半来对此进行更多优化。因此,如果您希望从3设置为sqrt(总计),您可以通过设置sqrt(总计)进行优化/2.一旦知道它不是素数,就应该退出循环,否则结果将在下一次迭代中被覆盖。使用else
子句(因为它只是反复设置相同的值)实际上没有意义,只需在循环之前设置该值:
prime = "this is a prime number";
for (var l = 2; l <= Math.sqrt(total); l++) {
if (total % l == 0) {
prime = "this is not a prime number";
break;
}
}
prime=“这是一个质数”;
对于(var l=2;lGuffa,您的方法是正确的,但是您可以通过包含两个条件来提高算法的效率。
1.检查一个数字是否可以被2整除。
对于偶数,它直接给出结果。
这种情况已经减少了一半的重复次数,如果
这个数字是奇数。
关于素数有一个非常有趣的事实,大多数人
不知道。每个素数都只在6的倍数之前出现
或者正好在6的倍数之后。我的意思是,例如,54是a
6的倍数。在56之前或之后必须有一个素数。让我们
检查:54+1=55,不是质数:54-1=53是质数
很清楚。现在我们将使用这个属性的相反形式“每个素数必须
在它之前或之后有一个6的倍数
质数与否。
a、 检查105+1=106是否为六的倍数?否
b、 检查105-1=104是否为六的倍数?否
所以105永远不可能是质数。
3.您可能会注意到此算法中存在歧义。您只能
确定一个数字是否不是具有此属性的素数,但它不能说明
你知道质数的确定性,我说过你必须检查
对于6的倍数,如果是,那么在或之前应该有一个素数
在那个倍数之后,但不清楚是在那个倍数之前还是之后。所以,
你也必须处理这个问题。我们只能检查非素数,但它可以
减少了大量的计算
我的密码:-
//以下代码是用Python编写的。但是任何初学者都能理解。
i='140740731462387462836487236478236487236487384783'
k=int(i)
如果(int(i[-1])%2==0):#获取数字的最后一个didgit并检查它是否为
#偶数。也可以将整个数除以2
打印('a.不是素数')
elif not((k-1)%6==0或(k+1)%6==0):#检查六的倍数。
打印('b.不是素数')
其他:
对于范围(3,int(k**(1/2))+2,2)内的j:#最终进近。将索引增加2
#因为你已经检查过了
#偶数。
印刷品(j)
如果(k%j==0):
打印('c.非素数'+str(j))
检查=0
打破
检查=1
如果(检查==1):
打印('A prime Number')
一旦发现该数字不是质数,就需要打破循环。该算法是正确的,但不适合于性能。应忽略除2以外的偶数。每一步应将循环增加2。这将提高性能