一道经典面试题:计算n以内的素数(质数)算法

来源:互联网 发布:淘宝开店店铺描述 编辑:程序博客网 时间:2024/06/15 01:42

一个很经典的面试题,最好你先能自己实现。

import java.util.ArrayList;import java.util.Date;public class sushu {/**     *  素数算法1     */static ArrayList<Integer> suan(int n){ArrayList<Integer> al = new ArrayList<Integer>();al.add(2);int max = (int)Math.sqrt(n);for (int i=3; i<=n; i+=2) {boolean is = true;for (Integer su : al) {if(su > max){break;} else if(i%su == 0){is = false;break;}}if(is){al.add(i);}}return al;}/**     *  素数算法2     */static int[] suan1(int n) {int len = (int)Math.ceil(n/2.0);boolean[] al = new boolean[len];int max = (int)Math.ceil(Math.sqrt(n));int rs=len,i=0,ii=0,tm=0;for (i=3; i<=max; i+=2) {for (ii=i; ii<=n; ii+=2) {tm = i*ii;if(tm>n){break;}if(!al[tm>>1]){rs--;al[tm>>1] = true;}}}int[] arr = new int[rs];int j = 0;for(i=0;i<len;i++){if(!al[i]){arr[j++] = (i<<1)|1;}}arr[0]++;return arr;}public static void main(String[] args) {int n = Integer.parseInt(args[0]);long t = new Date().getTime();ArrayList<Integer> al = sushu.suan(n);long f = new Date().getTime();System.out.println("run:"+(f-t)+"ms size:"+al.size());// for (Integer a : al ) {// System.out.println(a);// }t = new Date().getTime();int[] al1 = sushu.suan1(n);f = new Date().getTime();System.out.println("run:"+(f-t)+"ms size:"+al1.length);// for (int a : al1 ) {// System.out.println(a);// }}}


0 0
原创粉丝点击