Count Primes
Description:
Count the number of prime numbers less than a non-negative number, n.
方法1
public class CountPrimes {
public static void main(String[] args) {
System.out.println(countPrimes(1500000));
}
public static int countPrimes(int n) {
if (n == 0 || n == 1 || n == 2)
return 0;
int result = 0;
for (int i = 3; i < n; i += 2) {
boolean flag = true;
int sqrtNum = (int) Math.sqrt(i);
for (int j = 3; j <= sqrtNum; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) {
++result;
}
}
return result + 1;
}
}
超时了
需要一个标志位, 比如6, 是2的倍数, 可以剔除; 就没必要再根据是3的倍数进行剔除
方法2
试了一下这个方法, 用了容器, 还是超时了
public static int countPrimes(int n) {
if (n == 0 || n == 1 || n == 2)
return 0;
List<Integer> origin = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++)
origin.add(i);
for (int i = 3; i < n; i ++) {
if (i > origin.size() - 1)
break;
int num = origin.get(i);
int sqrtNum = (int) Math.sqrt(num);
for (int j = 2; j <= sqrtNum; j++) {
if (num % j == 0) {
origin.remove(i);
i--;
break;
}
}
}
return origin.size() -2;
}
方法3
import java.util.ArrayList;
import java.util.List;
public class CountPrimes {
public static void main(String[] args) {
System.out.println(countPrimes(1));
System.out.println(countPrimes(100));
System.out.println(countPrimes(1500000));
}
public static int countPrimes(int n) {
if (n == 0 || n == 1 || n == 2)
return 0;
boolean[] origin = new boolean[n];
for (int i = 0; i < n; i++)
origin[i] = true;
for (int i = 2; i < n; i++) {
if (origin[i]) {
int temp = i + i;
while (temp < n) {
origin[temp] = false;
temp = temp + i;
}
}
}
int result = 0;
for (int i = 2; i < n; i++) {
if (origin[i]) {
result++;
}
}
return result;
}
}
Note:
先设置一个长度为n, 值都为true的数组
从中依次剔除2, 3, 5, 7, 11的倍数
从每个数的 >=2 的倍数开始剔除, 不剔除它本身
比如 2 就不需要剔除, 3 也不需要剔除
那4不剔除, 不是错了吗? 4 是 2 的倍数, 早被剔除了, 同理, 6, 8 等等也是
本文探讨了在有限范围内高效计算质数数量的方法,通过改进筛选流程和避免重复检查,提出了三种不同策略来减少计算时间,包括使用布尔数组、列表容器和基于数学性质的筛选方法。重点介绍了如何通过优化循环和条件判断来提升算法性能。

被折叠的 条评论
为什么被折叠?



