编程以查找数字是否为素数

时间:2014-12-07 23:30:59

标签: javascript html if-statement for-loop primes

我正在使用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文件中用作函数的一部分

4 个答案:

答案 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;
  }
}

附注:您不需要在循环之前单独检查值23,这些将在循环中的前两次迭代中捕获。

答案 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