java中的Prime数字

时间:2016-01-14 11:26:36

标签: java

我写了一些代码来查找给定数字的素数。你能让我知道如何让我的代码更高效或更好吗?或者深入了解我的表现?另外,我的代码中存在一个问题,其中某些数字在模式中重复两次或三次。我该如何解决这个问题?

public class PrimeNumber2 {

   public static void main(String[] args)
   {

      int max_prime = 10000;
      for(int i = 3; i < max_prime; i+=2)
      {
         for(int j = 1; j < Math.sqrt(i); j++)
         {
            if(i % j == 0)
            {
                System.out.println(i);
            }
        }

     }

   }    
}

6 个答案:

答案 0 :(得分:2)

看看: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

这是一个很好的方式。

以下是一些代码供您查看:

public void runEratosthenesSieve(int upperBound) {

  int upperBoundSquareRoot = (int) Math.sqrt(upperBound);

  boolean[] isComposite = new boolean[upperBound + 1];

  for (int m = 2; m <= upperBoundSquareRoot; m++) {

        if (!isComposite[m]) {

              System.out.print(m + " ");

              for (int k = m * m; k <= upperBound; k += m)

                    isComposite[k] = true;

        }

  }

  for (int m = upperBoundSquareRoot; m <= upperBound; m++) {

        if (!isComposite[m]) {

              System.out.print(m + " ");

        }

}

答案 1 :(得分:1)

这是你的调整版。

我确实将检查数字是否是一个单独的方法。这也是你的版本多次打印值的部分原因,因为如果它发现它有一个除数,那么它会打印这些值。 (同样,你的algorythm会打印基本的所有东西,尽管它是否为素数,例如它打印15和27)。

它确实打印多个值的原因是,一旦你找到了一个除数,它就会打印i,但它会继续循环。如果它会找到另一个除数,它会再次打印i(您可以注意到它不仅打印素数)。

这是你的

的固定版本
public static void main(String[] args) {
    if(isPrime(2)) {
        System.out.println(2);
    }
    int max_prime = 10000;
    for(int i = 3; i < max_prime; i+=2)
    {
        if(isPrime(i)) {
            System.out.println(i);
        }
    }

}

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

答案 2 :(得分:1)

试试这个。

public class PrimeNumber2 {

    public static void main(String[] args) 
    {
        int max_prime = 10000;
        System.out.println(2);
     L: for (int i = 3; i < max_prime; i += 2)
        {
            for (int j = 3, max = (int)Math.sqrt(i); j <= max ; j += 2)
            {
                if(i % j == 0)
                {
                    continue L;
                }
            }
            System.out.println(i);
        }
    }
}

答案 3 :(得分:1)

这是使用parallelStream的方法

System.out.println(2);
IntStream.range(1, 10000000)
         .map(i -> i * 2 + 1)
         .filter(i -> (i & 1) != 0 && IntStream.range(1, (int) (Math.sqrt(i)-1)/2)
                                               .map(j -> j * 2 + 1)
                                               .noneMatching(j -> i % j == 0)
         .forEach(System.out::println);

注意:范围测试第n个奇数。

答案 4 :(得分:0)

public static void main(String[] args) {
    int upperBound = 30;
    List<Integer> primes = new ArrayList<>();

    // loop through the numbers one by one
    for (int number = 2; number < upperBound; number++) {
        boolean isPrimeNumber = true;

        // check to see if the number is prime
        for (int j = 2; j < number; j++) {
            if (number % j == 0) {
                isPrimeNumber = false;
                break; // exit the inner for loop
            }
        }

        // print the number if prime
        if (isPrimeNumber) {
            primes.add(number);
        }
    }
    System.out.println("The number of prime is: " + primes.size() + ", and they are: " + primes.toString());
}

enter image description here

可能会重复

get prime numbers and total prime numbers in range

答案 5 :(得分:-1)

public boolean isPrimeNumber(int number) {
    for (int i=2; i<=number/2; i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}