leetcode Count Primes 統計 素數 個數 超時 解決方案
阿新 • • 發佈:2019-01-10
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 等等也是