综合楼上的解答,我试着写了一个。
/**
* find all the prime up to n(including n)
*/
public static List findPrimes(int n){
List res = new ArrayList();
if (n <= 1) return res;
// create a boolean array to track whether a number
// is a prime or not
boolean[] primeTrack = new boolean[n+1];
for (int i = 2; i <= n; i++){
primeTrack[i] = true;
}
int upper = (int)Math.sqrt(n);
for (int i = 2; i <= upper; i++){
for (int j = i * i; j <= n; j += i){
primeTrack[j] = false;
}
}
for (int i = 2; i <= n; i++){
if (primeTrack[i] == true){
res.add(i);
}
}
return res;
}
public static List primeFactors(int n){
List factors = new ArrayList();
// return an empty list
if (n <= 1){
return factors;
}
// all the prime numbers up to sqrt(n)
List primes = findPrimes((int)Math.sqrt(n));
for (int i : primes){
while ( n % i == 0){
factors.add(i);
n /= i;
}
if (n == 1){
break;
}
}
// the remaining is a prime number, add to the result
if (n > 1){
factors.add(n);
}
return factors;
}