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

