该算法比较高效(肯定有更高效的算法,没再继续优化算法),求1亿内所有素数也仅为2秒左右,依据是所有的合数都可以拆分为:n * m ,而质数只能被1和其本身整除。
/**
* 求0-num 所有质数
* @author https://www.lanhong-vip.com/
* @date 2020-12-19
*/
public class GetPrimeByNum {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
int num = 100000000;
byte[] list = new byte[num + 1];
//0与1不是质数,排除,置为-1,byte数组默认各元素值为0
list[0] = list[1] = -1;
for (int i = 2; i <= num; i++) {
if (list[i] == 0) {
//任意合数都有除1和本身能整除其的数
for (int j = i * 2; j<= num; j += i) {
//是合数将其值修改成-1
list[j] = -1;
}
}
}
int count = 0;
//计算质数的数量,为0的都是质数
for (int i = 1; i < num; i++) {
if (list[i] == 0) count++;
}
System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "毫秒,个数:" + count);
}
}
