1.常规思路:
给定n. 任取2<=i<=n, 设k=sqrt(i),若果2到k之间的数字全部都不能整除i,那么i就是素数。
2、埃拉托斯特尼筛法:
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
实现代码:
public class sushu { public static void main(String[] args) { // TODO Auto-generated method stub int n=300000; long t1=System.currentTimeMillis(); primeFilte(n); long t2=System.currentTimeMillis(); Eratosthenes(n); long t3=System.currentTimeMillis(); System.out.println(t2-t1); System.out.println(t3-t2); System.out.println(isPrime(n)); } //埃拉托斯特尼筛法: private static int Eratosthenes(int n) { // TODO Auto-generated method stub int num=0; boolean filter[]=new boolean[n+1]; //0,1这两个下标废弃不用,因为素数是从2开始的 for (int i = 2; i <=n; i++) { filter[i]=true; //初始化为true } for (int i = 2; i <=Math.sqrt(n); i++) { if (filter[i]) { int j=i<<1; //先翻倍 while(j<=n){ if (filter[j]) { filter[j]=false; //j是i的倍数,所以不是素数,标志位flase } j+=i; //分别变成3i,4i...... } } } for (int i = 2; i <= n; i++) { if (filter[i]) { //System.out.println(i+" "); 不打印是为了测试性能,打印消耗时间,若果你想看到具体素数那就注释掉 num++; } } return num; } //判断是不是素数 public static boolean isPrime(int n) { // TODO Auto-generated method stub int k,j=0,i=n; k=(int) Math.sqrt(i); for ( j = 2; j <=k; j++) { if (i%j==0) break; } if (j>k) { return true; } return false; } //常规解法 private static int primeFilte(int n) { int i,j,k,num=0; for (i = 2; i <=n; i++) { k=(int) Math.sqrt(i); for (j = 2; j <=k; j++) { if (i%j==0) { break; } } if (j>k) { // System.out.println(i+" "); 不打印是为了测试性能,打印消耗时间,若你想看到具体素数那就注释掉 num++; } } return num; } }
测试结果:
n=30W时,测试结果毫秒级
时间: 2024-10-13 16:17:39