62,626
社区成员
发帖
与我相关
我的任务
分享
public class test {
public static void main(String []args){
long start=System.currentTimeMillis();
for(int i=2;i<=100000;i++){
if(isPrime(i)==1){
System.out.println(i+" ");
}
}
long end=System.currentTimeMillis();
System.out.println(end-start);
}
static int isPrime(int n){
if(n<2)
return 0;
for(int i=2;i*i<=n;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
}我这是232ms,楼上是大牛import java.util.*;
public class GetPrimes {
// 以空间换时间查找质数
public static void main(String[] args) {
// 查找质数
long start = System.currentTimeMillis();
List<Integer> primes = listPrimes(100000);
System.out.println("time: " + (System.currentTimeMillis() - start) + "ms");
// 打印查找结果
outputPrimes(primes);
}
private static List<Integer> listPrimes(int max) {
// 保存已经找到的质数
LinkedList<Integer> primeList = new LinkedList<>(Arrays.asList(2, 3));
// 如果只查找 3 以内的质数,直接返回初始值
if (max <= 3) {
return primeList;
}
// 3 以上的质数一定是奇数,因此 next 每次 +2,然后检查它是否是质数
int next = primeList.getLast() + 2;
while (next < max) {
boolean isPrime = true;
// 利用已经找到的质数来检验 next 是否是质数
// 不需要用 primeList 中所有的数来检查,只需检查到 next 的平方根即可
// 如果这之前的所有的质数都不能整除 next,那么 next 就是质数
for (Integer n : primeList) {
if (n * n > next) {
break;
} else if (next % n == 0) { // 被整除了,说明不是质数
isPrime = false;
}
}
if (isPrime) {
primeList.add(next);
}
next = next + 2; // 下一个要检查的数字
}
return primeList;
}
private static void outputPrimes(List<Integer> primes) {
int counter = 0;
for (Integer prime : primes) {
System.out.print(prime + " ");
counter++;
if (counter % 30 == 0) {
System.out.println();
}
}
}
}