在Java中判断一个数是否是素数
时间:2020-02-23 14:34:10 来源:igfitidea点击:
什么是质数?
质数是大于1的自然数,只能除以1及其本身。
例如,5是质数,因为它只能除以1和5。
同样,6不是质数,因为它可以除以1、2、3和6。
查找介于1和N之间的质数的算法
有很多算法可以找到给定范围内的素数。
" Eratosthenes筛"是一种流行的且简单的算法,可以找到指定范围内的质数。
查找介于1和N之间的质数的算法具有以下步骤。
创建一个从2到N的连续数字列表,即(2,3,4…N)。
从第一个和最小的素数2开始。
假设变量p = 2。找出p的倍数,即2p,3p,4p直到N,并在列表中将其标记为非素数。
请注意,数字p本身不应标记。在列表中找到未标记的下一个号码,并按照前面的步骤操作。
当列表中的数字用完时,算法终止。
未标记的数字列表是1到N之间的质数。
下面的GIF给出了算法的直观表示(来源:Wikipedia)。
Eratosthenes筛选算法
查找1到N之间的质数的Java实现
package com.theitroad.examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class PrimeNumbers { public static void main(String[] args) { System.out.println(findPrimeNumbers(100)); } //generating the list of prime numbers from 2 to the given number //using the Sieve of Eratosthenes algorithm private static List<Integer> findPrimeNumbers(int n) { //initialize the array with "true", index denotes the numbers from 0 to n. boolean[] primes = new boolean[n + 1]; Arrays.fill(primes, true); //loop from 2 to x until x*x becomes greater than n for (int i = 2; i * i < n; i++) { //process if the number is not already marked if (primes[i]) { //find the multiples and mark them as false for (int j = i * i; j <= n; j += i) primes[j] = false; } } //populate the list of prime numbers from the array and return it List<Integer> primeNumbers = new ArrayList<>(); for (int i = 2; i <= n; i++) { if (primes[i]) primeNumbers.add(i); } return primeNumbers; } }
输出:[2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83, 89,97]
检查数字是否为素数的算法?
检查数字是否为质数的最简单方法是使用试验除法。
对于给定的数字N,请检查是否有一个2到√N(平方根)之间的质数M对其进行平均除法,即余数为0。
如果有一个数M均匀地除以N,则N不是质数。
否则,N是质数。
Java实现检查素数
这是检查数字是否为质数的实现。
我们将使用较早定义的方法来找出2到√N之间的质数。
package com.theitroad.examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class PrimeNumbers { public static void main(String[] args) { int number = 123456789; boolean isPrime = checkPrime(number); System.out.printf("%d is Prime: %b.\n", number, isPrime); System.out.printf("%d is Prime: %b.\n", 3511, checkPrime(3511)); System.out.printf("%d is Prime: %b.\n", 123, checkPrime(123)); } //a number is not prime if there is a prime number between 2 to the square root of //num that evenly divides it private static boolean checkPrime(int num) { //get the prime numbers from 2 to square root of num. List<Integer> primes = findPrimeNumbers(Double.valueOf(Math.sqrt(num)).intValue()); System.out.println(primes); for (int i : primes) { if (num % i == 0) { System.out.printf("%d is divided by %d.\n", num, i); return false; } } return true; } }