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

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

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);
		// }

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值