eclipse 如何判断一个数是否为素数

cx6n0qe3  于 2022-11-04  发布在  Eclipse
关注(0)|答案(7)|浏览(303)

好吧,我的问题不是如何弄清楚一个数字是否是素数,因为我想我已经弄清楚了,而是如何让它正确显示。
下面是我的代码:

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,它会说它是质数,我认为问题是break在一个循环后停止它所以它不是递增变量p所以它只是测试除以2(我想)。但是如果我删除断点,它会在每次传递时打印出“和是/不是素数”,直到它退出循环。不确定在这里该怎么做。

dbf7pr2w

dbf7pr2w1#

你的方法是正确的,为了使它不一致地输出一个数是否是素数,你可以有一个外部变量,它代表这个数是否是素数。

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 = sum的平方根的时候。所以使用这种方法,for循环看起来会像这样:

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

希望这对你有帮助

flvlnr44

flvlnr442#

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

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

kmynzznz3#

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

可以改进此代码以提高效率和代码的优雅性。
为了提高效率,您不需要检查所有小于sum的数的可分性,检查所有小于sum平方根的数就足够了。
为了获得更好的代码,请创建一个单独的函数来测试一个数字是否为素数。
下面是一个同时实现这两种功能的示例。

// 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.");
 }
6pp0gazn

6pp0gazn4#

小质数

使用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);

它使用Miller-Rabin概率检验,以保证得到一个结果:它使用第一个素数作为连续基数(参见Handbook of Applied Cryptography by Menezes, table 4.1/ page 140)。
大质数
如果要寻找大于Integer.MAX_VALUE的素数:
1.使用BigInteger#isProbablePrime(int certainty)预验证主要候选项
如果这个BigInteger可能是素数,则返回true;如果它肯定是合数,则返回false。如果确定性≤ 0,则返回true。参数:确定性-呼叫者愿意容忍的不确定性的度量:如果调用返回true,则此BigInteger为质数的概率超过(1 - 1/2certainty)。此方法的执行时间与此参数的值成比例。
1.接下来使用"AKS Primality Test"来检查候选是否确实是素数。

4dc9hkyq

4dc9hkyq5#

到目前为止,已经有很多答案是正确的,但是没有一个是经过优化的。这就是为什么我想在这里与你分享优化后的代码来确定素数。请看下面的代码片段...

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。
1.它只对奇数运行for循环。
1.它会将for循环变量增加2而不是1。
1.它只会迭代for循环到number的平方根,而不是number.
解说--:
我已经提到了上面的四点,我将逐一解释。代码必须适当地为无效输入编写,而不是只为有效输入编写。到目前为止所写的任何答案都被限制在有效输入范围内,其中数字为iNum >=2
我们应该知道,只有奇数才能是素数,**注-:2是唯一一个偶数素数。因此,我们不能对偶数运行for循环。
我们不能对变量i的偶数值运行for循环,因为我们知道只有偶数才能被偶数整除。我在上面已经提到过,只有奇数才能素数,除了2是偶数。因此,不需要对for中变量i的偶数值运行for循环内的代码
我们应该只迭代for循环到数字的
平方根
,而不是数字。很少有答案实现了这一点,但我仍然想在这里提到它。

wgmfuz8q

wgmfuz8q6#

时间复杂度为O()),时间复杂度为O(n)。

public static boolean isPrime(int num) {

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

    return true;
}
ndasle7k

ndasle7k7#

您可以使用JavaBigInteger类的isProbablePrime方法以一种简单的方式确定并打印出该和是否为素数。

BigInteger number = new BigInteger(sum);
        if(number.isProbablePrime(1)){
            System.out.println("prime");
        }
        else{
            System.out.println("not prime");
        }

您可以在www.example.com阅读有关此方法的更多https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#isProbablePrime%28int%29

相关问题