我正在使用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文件中用作函数的一部分
答案 0 :(得分:3)
一旦你知道它不是素数就应该退出循环,否则结果将在下一次尝试中被覆盖。实际上没有必要使用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
,这些将在循环中的前两次迭代中捕获。
答案 1 :(得分:0)
首先,对于素数,你不需要检查偶数(2,4,6等),所以你的for循环可以从3和l = l + 2。
其次,你的功能如何失败?好像你应该记住这个状态,如果它不是主要的打破循环(或者如果它是,不知道你想要什么)。
此外,您可以通过将循环设置为所需数字的一半来进行更优化。因此,如果您想从3变为sqrt(总计),您可以通过转到sqrt(总计)/ 2进行优化。
答案 2 :(得分:0)
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
答案 3 :(得分:0)
此解决方案检查数字是否在 O(n 的根) 时间内为素数:
function isPrime(n) {
if (n <= 4) {
return n > 1 && n < 4
}
i = Math.floor(Math.sqrt(n))
while (i >= 2) {
if (n % i === 0) return false
i -= 1
}
return true;
};
console.log(isPrime(47)) //true