Methods 打印所有素数、Sophie Germain素数、孪生素数和Mersenne素数1到1000000的代码

Methods 打印所有素数、Sophie Germain素数、孪生素数和Mersenne素数1到1000000的代码,methods,boolean,Methods,Boolean,我编写了一个代码,可以测试一个数字是素数、索菲·日尔曼素数、孪生素数还是梅森素数。我需要把它变成一个新的代码,测试所有0-1000000的数字,并打印出属于这些类型的每个数字。这是我需要更改的原始程序 import java.util.Scanner; public class PrimeMethodsDemo_slm { public static boolean isPrime (int n) { boolean isPrime = true; if

我编写了一个代码,可以测试一个数字是素数、索菲·日尔曼素数、孪生素数还是梅森素数。我需要把它变成一个新的代码,测试所有0-1000000的数字,并打印出属于这些类型的每个数字。这是我需要更改的原始程序

import java.util.Scanner;
public class PrimeMethodsDemo_slm {
    public static boolean isPrime (int n) {
        boolean isPrime = true;
        if (n < 2) isPrime = false;
        else if (n == 2) isPrime = true;
        else for (int i = 2; i < Math.sqrt(n) + 1; ++i) {
            if (n % i == 0) return false;
        }
        return isPrime;
    }
    
    public static boolean isSophieGermainPrime (int n) {
        boolean isPrime = true;
        if (n < 2) isPrime = false;
        else if (n == 2) isPrime = true;
        else for (int i = 2; i < Math.sqrt(n) + 1 & (i < Math.sqrt(n * 2 + 1) + 1);
            ++i)
        {
            if (n % i == 0) return false;
        }
        return isPrime;
    }
    
    public static boolean isTwinPrime (int n) {
        boolean isPrime = true;
        if (n < 2) isPrime = false;
        else if (n == 2) isPrime = true;
        else for (int i = 2; i < Math.sqrt(n) & i < Math.sqrt(n + 2) + 1; ++i) {
            if (n % i == 0) return false;
        }
        return isPrime;
    }
    
    public static boolean isMersennePrime (int n) {
        boolean isPrime = true;
        if (n < 2) isPrime = false;
        else if (n == 2) isPrime = true;
        else
            for (int i = 2; i < Math.sqrt(n) + 1 & i < Math.sqrt(2 * n - 1) + 1; ++i)
            {
                if (n % i == 0) return false;
            }
        return isPrime;
    }
}
import java.util.Scanner;
公共类PrimeMethodsDemo_slm{
公共静态布尔iPrime(int n){
布尔值isPrime=true;
如果(n<2)isPrime=false;
如果(n==2)isPrime=true,则为else;
(inti=2;i
我将首先简化
isPrime(intn)
方法。以下是我的简化解决方案:

public static boolean isPrime (int n) {
    if (n < 2) return false;
    BigInteger bigInt = BigInteger.valueOf(n);
    return bigInt.isProbablePrime(100);
}
最后,您需要包括一个
main
方法,该方法迭代您范围内的所有数字,并打印出一个数字是否为素数、Sophie Germain、Twin和/或Mersenne素数

public static void main (String[] args) {
    System.out.printf("%15s | %6s | %16s | %5s | %9s |%n", "Number", "Prime?", "Sophie Germain?", "Twin?", "Mersenne?");
    for (int i = 1; i <= 1000000; i++) {
        System.out.printf("%15d | %6b | %16b | %5b | %9b |%n", i, isPrime(i), isSophieGermainPrime(i), isTwinPrime(i), isMersennePrime(i));
    }
}
更新: OP评论说“主方法有效,但我只需要它打印出每种类型的素数”

使用我的解决方案并遵守此要求的一个潜在方法是简单地指示循环打印所需内容。例如,要打印Sophie Germain素数,只需执行以下操作:

public static void main (String[] args) {
    System.out.printf("%10s%n", "Sophie Germain Primes");
    for (int i = 1; i <= 1000000; i++) {
        if (isSophieGermainPrime(i)) {
            System.out.printf("%7d%n", i);              
        }
    }
}

根据您的代码缺少
main
方法,上面显示的顺序是正确的。如果您的原始代码中有它,请添加它。另外,编辑代码以便显示原始方法。基于一个被误解的要求,我错误地编辑了。我还没有测试你给我的布尔方法的简化版本,主要方法是有效的,但我只需要它来打印出每种类型的素数,我目前正试图找出如何做到这一点。谢谢你的帮助,非常感谢。@seb93原则是一样的。您希望创建一个基本的case方法来检查给定的数字是否为素数。然后,您需要使用该方法来推导它是否也是这些特殊情况之一。例如,如果
p
2p+1
都是素数,则称素数
p
为Sophie Germain素数。因此,我确定它的方法是
issophigegermain(int n)
{return isPrime(n)&&isPrime(2*n=1);}`你看到了吗?您可以在确定是否打印数字的方法中使用这些方法。例如:
if(issophigegermain(n)){System.out.print(n);}
@seb93我上面展示的表格形式对梅森素数不起作用,因为它将基于指数
n
而不是实际的梅森素数打印
true
false
。这是因为我使用了
Math.pow(2,n)-1
,循环根据
n
打印出来。你也必须弄清楚这一点。
Number | Prime? |  Sophie Germain? | Twin? | Mersenne? |
     1 |  false |            false | false |     false |
     2 |   true |             true | false |      true |
     3 |   true |             true |  true |      true |
     4 |  false |            false | false |     false |
     5 |   true |             true |  true |      true |
     6 |  false |            false | false |     false |
     7 |   true |            false |  true |      true |
     8 |  false |            false | false |     false |
     9 |  false |            false | false |     false |
    10 |  false |            false | false |     false |
    11 |   true |             true |  true |     false |
    12 |  false |            false | false |     false |
    13 |   true |            false |  true |      true |
    14 |  false |            false | false |     false |
    15 |  false |            false | false |     false |
    16 |  false |            false | false |     false |
    17 |   true |            false |  true |      true |
    18 |  false |            false | false |     false |
    19 |   true |            false |  true |      true |
    20 |  false |            false | false |     false |
    21 |  false |            false | false |     false |
    22 |  false |            false | false |     false |
    23 |   true |             true | false |     false |
    24 |  false |            false | false |     false |
    25 |  false |            false | false |     false |
    26 |  false |            false | false |     false |
    27 |  false |            false | false |     false |
    28 |  false |            false | false |     false |
    29 |   true |             true |  true |     false |
    30 |  false |            false | false |     false |
    31 |   true |            false |  true |     false |
public static void main (String[] args) {
    System.out.printf("%10s%n", "Sophie Germain Primes");
    for (int i = 1; i <= 1000000; i++) {
        if (isSophieGermainPrime(i)) {
            System.out.printf("%7d%n", i);              
        }
    }
}
Sophie Germain Primes
      2
      3
      5
     11
     23
     29
     41
     53
     83
     89
    113
    131
    ...