繁体   English   中英

Java中的素数

[英]Prime Number in 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);
            }
        }

     }

   }    
}

看看: 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 + " ");

        }

}

这是您的调谐版本。

我确实将检查数字是否为素数作为单独的方法。 这也是您的版本多次打印值的部分原因,因为如果发现版本有除数,则它将打印值。 (此外,您的算法将基本打印所有内容,无论它是否为素数,例如打印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;
}

尝试这个。

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);
        }
    }
}

这是使用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个奇数。

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());
}

在此处输入图片说明

可能重复

获取素数和范围内的素数总数

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM