这里给出了比较高效的求法,一个是常规的,一个是筛法。
- import java.util.ArrayList;
- import java.util.Iterator;
- //判断101-200之间有多少个素数,并输出所有素数。
- public class Sushu
- {
- public static void main(String[] args)
- {
- ArrayList<Integer> al=getSuShu(2,200);//获得保存有所有小于200的素数的数组
- //ArrayList<Integer> al=getSuShu2(2,200);//获得保存有所有小于200的素数的数组
-
- System.out.println("给定范围内素数的个数为:"+al.size()+"个");
- System.out.print("这些素数分别是:");
- for(Iterator<Integer> it=al.iterator();it.hasNext();)
- {
- System.out.print(it.next()+" ");
- }
- }
- private static ArrayList<Integer> getSuShu(int min,int max)//常规的遍历除
- {
- ArrayList<Integer> al=new ArrayList<Integer>();
-
- boolean flag=true;//标志是否为素数
-
- if(min<=2)
- al.add(2);
-
- for(int i=(min%2==0?min+1:min);i<=max;i+=2)//素数除了2都不为偶数
- {
- flag=true;//初始化标识
- for(int j=3;j<=Math.sqrt(i);j++)//因为已经排除了偶数所以可以不除2
- {
- if(i%j==0)//只要能被整除就不是素数,跳出循环
- {
- flag=false;
- break;
- }
- }
- if(flag)
- al.add(i);//向集合添加素数
- }
-
- return al;
- }
-
- private static ArrayList<Integer> getSuShu2(int min,int max)//筛法
- {
- ArrayList<Integer> al=new ArrayList<Integer>();//创建一个集合进行筛
- ArrayList<Integer> al2=new ArrayList<Integer>();//保存筛出的素数
-
- for(int i=2;i<max+1;i++)//初始化集合
- {
- al.add(i);
- }
-
- int a=0;//初始化除数
- while(al.size()>0)//如果第一个集合内还有值就继续筛
- {
- a=al.get(0);//获得第一个集合中最小的数,这个数一定是素数
- al2.add(a);//将这个素数加入集合2
- for(int i=0;i<al.size();i++)//删除集合中这个数的倍数
- {
- if(al.get(i)%a==0)
- al.remove(i);
- }
- }
-
- for(int i=0;i<al2.size();i++)//遍历集合删除不符合范围的素数
- {
- if(al2.get(i)<min||al2.get(i)>max)
- al2.remove(i);
- }
-
- return al2;
- }
- }
复制代码 |