参考博文http://blog.csdn.net/program_think/article/details/7032600
求小于N的所有质数
1.尝试所有小于N的数
2.只要尝试小于√x 的质数即可。而这些质数,恰好前面已经算出来了
3.筛选法 首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......
1 public class TestSushu { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 TestSushu test = new TestSushu(); 9 10 ArrayList<Integer> mlist = test.getNumforSelect(10); 11 12 System.out.println(mlist.toString()); 13 } 14 15 // 求小于N的所有素数 16 17 // 1) 试除法 -狂举法 18 19 // 2)试除法--算法 20 // 只要尝试小于√x 的质数即可 21 22 // 3)筛法 23 24 public ArrayList<Integer> getNumforDivAll(int N) { 25 ArrayList<Integer> mList = new ArrayList<Integer>(); 26 if (N < 2) { 27 } else { 28 for (int i = 2; i <= N; i++) { 29 boolean flag = false; 30 for (int j = 2; j < i; j++) { 31 if (i % j == 0) {// 有其他余数 则不是质数 32 flag = true; 33 break; 34 } 35 } 36 if (!flag) { 37 mList.add(new Integer(i)); 38 } 39 } 40 } 41 42 return mList; 43 } 44 45 public ArrayList<Integer> getNumforDivOpt(int N) { 46 ArrayList<Integer> mList = new ArrayList<Integer>(); 47 if (N < 2) { 48 49 } else { 50 int square = (int) Math.sqrt(N); 51 52 for (int i = 2; i <= N; i++) { 53 boolean flag = false; 54 for (int j : mList) { 55 if (i % j == 0) {// 有其他余数 则不是质数 56 flag = true; 57 break; 58 } else if (j > square) {// 超过平方根 不再判断 59 break; 60 } 61 } 62 if (!flag) { 63 mList.add(new Integer(i)); 64 } 65 } 66 } 67 68 return mList; 69 } 70 71 // 筛选法 72 public ArrayList<Integer> getNumforSelect(int N) { 73 ArrayList<Integer> mList = new ArrayList<Integer>(); 74 for (int i = 2; i < N; i++) { 75 mList.add(new Integer(i)); 76 } 77 78 int idx = 0; 79 while (idx < mList.size()) { 80 int curdata = mList.get(idx); 81 int i = idx+1; 82 while (i<mList.size()) { 83 if(mList.get(i)%curdata==0){// 整除的倍数 删掉 84 mList.remove(i); 85 }else{ 86 i++; 87 } 88 } 89 idx++; 90 } 91 92 return mList; 93 } 94 95 }