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

时间:2016-10-23 04:12:26

标签: java eclipse loops primes

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

这是我的代码:

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(我认为)。但是如果我删除断点,它将在每次传递中打印出“和/不是素数”,直到它退出循环。不知道该怎么做。

6 个答案:

答案 0 :(得分:5)

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

    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.");

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

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

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

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

希望这有帮助

答案 1 :(得分:5)

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

//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 :(得分:1)

你是对的,目前你的代码测试除以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.");
 }

答案 3 :(得分:1)

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

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&amp; 1也是。
  2. 它仅针对奇数运行for循环。
  3. 它会将for循环变量增加2而不是1。
  4. 它只会将for循环迭代到数字的平方根而不是数字。
  5.   

    解释 - :

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

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

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

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

答案 4 :(得分:1)

小素数

使用Apache Commons Math 素性测试,方法与int范围内的素数相关。您可以在GitHub上找到源代码。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

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

它以这样的方式使用米勒 - 拉宾概率检验   结果是有保证的:它使用第一个素数作为连续   base(请参阅Menezes, table 4.1 /第140页的应用加密手册)。

大素数

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

  1. 使用BigInteger#isProbablePrime(int certainty)预先验证主要候选人

      

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

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

答案 5 :(得分:1)

最有效的时间复杂性:

public static boolean isPrime(int num) {

    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;
        }
    }

    return true;
}