我正在使用JavaScript编写一段代码,以检查数字是否为质数。该代码正确地告诉我数字= 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) {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"}
}
该代码在html文件中用作功能的一部分
一旦您知道它不是素数,就应该退出循环,否则结果将在下一次安装时被覆盖。实际上,拥有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;
}
}
旁注:您无需在循环之前分别检查值2
和3
,这些值将被循环中的前两次迭代捕获。
首先,对于质数,您不需要检查偶数(2、4、6等),因此您的for循环可以从3开始,l = l + 2。
第二,您如何运行失败?似乎您应该记住状态,如果状态不是素数,则中断循环(或者如果不是,则不知道您想要什么)。
此外,您可以通过对所需数字的一半进行循环来进一步优化此效果。因此,如果要从3变为sqrt(总数),可以通过转到sqrt(总数)/ 2进行优化。
Guffa,您的方法是正确的,但是您可以通过包含两个条件来提高大量算法的效率。1.检查数字是否可被2整除。对于偶数,它直接给出结果。如果这种情况已经减少了一半的重复次数数字是奇数。2.关于质数有一个非常有趣的事实,大多数人不知道每个素数都恰好在6的倍数之前或恰好在六的倍数之后。我的意思是。例如54是一个6的倍数。在56.Let之前或之后必须有一个质数。支票:54 + 1 = 55,而不是素数:54-1 = 53是素数。清楚了。现在,我们将反向使用此属性,“每个素数必须前后有6的倍数。”如果我必须检查105是否为是否有质数。一种。检查105 + 1 = 106是否为6的倍数?没有b。检查105-1 = 104是否为6的倍数?没有因此105绝对不能是质数。3.您可能会注意到该算法存在歧义。你只能判断数字是否不是此属性的质数,但它不能说明您确定数量是素数。我提到你必须检查对于6的倍数,如果是6的倍数,则在或之前应有素数在该倍数之后,但不清楚是在此之前还是之后。所以,您也必须处理。我们只能检查不是Prime,但可以减少大量计算。
我的代码:-
// The following code is written in Python. But anyone beginner level Programmer can understand it.
i = '140740731462387462836487236478236487236487384783'
k = int(i)
if (int(i[-1])%2 == 0): #Get the last didgit of the number and check if it is
#even.One can also just divide the whole num by 2
print('a.Not a Prime')
elif not((k-1)%6==0 or (k+1)%6==0):#Check for multiple of six.
print('b.Not a Prime')
else :
for j in range(3,int(k**(1/2))+2,2): # Final approach.Increment index by 2
#because you have already checked for
#even numbers.
print(j)
if (k%j==0):
print('c.Not a Prime'+str(j))
check=0
break
check =1
if (check ==1):
print('A prime Number')
谢谢,Mahyar Ali