如何确定一个数字是否为素数

好吧,我的问题不是如何弄清楚一个数字是否是素数,因为我认为我想出了这个,但更多的是如何让它正确显示。

这是我的代码:

public static void main(String[] args) { // Declare Variables int randomNumbers = 0; int sum = 0; //Loop for number generation and print out numbers System.out.print("The five random numbers are: "); for (int i = 0; i <= 4; i++) { randomNumbers = (int)(Math.random()*20); sum += randomNumbers; if (i == 4) { System.out.println("and " + randomNumbers + "."); } else { System.out.print(randomNumbers + ", "); } } //Display Sum System.out.println("\nThe sum of these five numbers is " + sum + ".\n"); //Determine if the sum is prime and display results for(int p = 2; p < sum; p++) { if(sum % p == 0) System.out.println("The sum is not a prime number."); else System.out.println("The sum is a prime number."); break; } } } 

现在我的问题是,如果数字最终是9,它会说它是素数,它不是。 我认为问题是中断在一个循环之后停止它所以它不是递增变量p所以它只测试除以2(我认为)。 但是如果我删除断点,它将在每次传递时打印出“和/不是素数”,直到它退出循环。 不知道该怎么做。

您查找数字是否为素数的方法是正确的方法。 为了使它不会一直打印出数字是否为素数,你可以有一个外部变量,它代表数字是否为素数。

  boolean prime = true; for (int p = 2; p < sum; p++) { if (sum % p == 0) { prime = false; break; } } if (prime) System.out.println("The sum is a prime number."); else System.out.println("The sum is not a prime number."); 

通过这种方法,程序将假定数字为素数,直到它certificate是错误的。 因此,当它发现它不是素数时,它将变量设置为false并突破循环。

然后在循环结束后,您只需要打印该数字是否为素数。

一种可以使这个循环更快的方法是从p = 2到p = sum的平方根。 因此,使用此方法,您的for循环将如下所示:

  double sq = Math.sqrt((double)sum); for (int p = 2; p < sq; p++) { //Rest of code goes here } 

希望这可以帮助

你需要存储数字是否在循环外的布尔值中是素数:

 //Determine if the sum is prime and display results boolean isPrime = true; for(int p = 2; p < sum; p++) { if(sum % p == 0){ isPrime = false; break; } } if(isPrime){ System.out.println("The sum is a prime number."); } else { System.out.println("The sum is not a prime number."); } 

你是对的,目前你的代码测试除以2,break命令在一个循环后停止。

在第一次循环之后(p == 2), break将始终停止循环。

对代码的最快修复将改变循环部分,如下所示:

 boolean isPrime=true; for(int p = 2; p < sum; p++) { if(sum % p == 0) { isPrime=false; System.out.println("The sum is not a prime number."); break; } } if (isPrime) System.out.println("The sum is a prime number."); 

此代码可以提高效率和代码优雅。

为了提高效率,您不需要通过小于总和的所有数字来检查可分性,这足以检查所有小于和的平方根的数字。

为了获得更好的代码,请创建一个单独的函数来测试数字是否为素数。

这是一个实现两者的示例。

  // tests if n is prime public static boolean isPrime(int n) { if (n<2) return false; for(int p = 2; p < Math.sqrt(n); p++) { if(n % p == 0) return false; // enough to find one devisor to show n is not a prime } return true; // no factors smaller than sqrt(n) were found } public static void main(String []args){ ... System.out.println("sum is "+ sum); if (isPrime(sum)) System.out.println("The sum is a prime number."); else System.out.println("The sum is not a prime number."); } 

到目前为止,已经发布了许多答案,这些答案是正确的,但没有一个是优化的。 这就是为什么我想与你分享优化代码以确定素数。 请看下面的代码片段……

 private static boolean isPrime(int iNum) { boolean bResult = true; if (iNum <= 1 || iNum != 2 && iNum % 2 == 0) { bResult = false; } else { int iSqrt = (int) Math.sqrt(iNum); for (int i = 3; i < iSqrt; i += 2) { if (iNum % i == 0) { bResult = false; break; } } } return bResult; } 

上述代码的好处 - :

  1. 它适用于负数和0和1。
  2. 它只会为奇数运行for循环。
  3. 它会将for循环变量增加2而不是1。
  4. 它只会迭代for循环,直到数字的平方根而不是数字。

说明-:

我已经提到了上面的四点,我将逐一解释。 必须为无效输入编写代码, 而不是仅为有效输入编写代码。 到目前为止所写的答案都限于有效的输入范围,其中数字iNum >=2

我们应该知道只有奇数可以是素数注意:2是唯一的素数。 所以我们不能为偶数运行循环。

我们不能for它的变量i偶数值运行循环,因为我们知道只有偶数可以用偶数除。 我已经在上面提到过,只有奇数可以是素数,除了2是偶数。 因此,无需在for循环中运行代码,即使for变量i值也是如此

我们应该迭代循环,直到数字的平方根而不是数字。 很少有答案实现了这一点,但我仍然想在这里提一下。

小素数

使用Apache Commons Math primality test ,方法与int范围内的素数有关。 你可以在GitHub上找到源代码。

  org.apache.commons commons-math3 3.6.1  // org.apache.commons.math3.primes.Primes Primes.isPrime(2147483629); 

它使用Miller-Rabin概率检验,以保证结果:它使用第一个素数作为连续基数(参见Menezes的应用加密手册,表4.1 /第140页)。

大素数

如果您正在寻找大于Integer.MAX_VALUE素数:

  1. 使用BigInteger#isProbablePrime(int certainty)预先validation主要候选者

    如果此BigInteger可能是素数,则返回true;如果它肯定是复合的,则返回false。 如果确定性≤0,则返回true。 参数:确定性 – 调用者愿意容忍的不确定性的度量:如果调用返回true,则此BigInteger为素数的概率超过(1 – 1/2确定性)。 此方法的执行时间与此参数的值成比例。

  2. 接下来使用“AKS Primality Test”检查候选人是否确实是素数。

最有效的时间复杂性:

 public static boolean isPrime(int num) { for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return false; } } return true; }