JAVA初学(三):用“埃氏筛法”求2~100以内的素数

一、解决的问题

今天要解决的问题是:用“埃氏筛法”求2~100以内的素数。素数有许许多多的求法,探索素数快速算法也成为程序猿们孜孜不倦的追求,今天的“埃氏筛法”不算是最快的一种,却也有其巧妙的地方。

二、“埃氏筛法”的原理

1.埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,先去掉2的倍数,再去掉3的倍数,再去掉5的倍数,……依此类推,最后剩下的就是素数。剩下的就是素数。
2.本次JAVA代码对题目要求做出了进一步加强,可以求任意大于2的数的素数。
3.关于计算根号n以内的素数的原理将在下一篇博文中介绍。(事实上如果不是题目要求使用“埃氏算法”,直接使用这部分代码也可以算出任意值内的素数)

三、代码及注释

import java.util.Scanner;
public class test 
{
public static void main(String[] args) 
{
    Scanner scan =new Scanner(System.in);//通过键盘输入数值
    System.out.print("请输入数据:");
    int input=scan.nextInt();
/**************计算根号K以内的素数***************/    
    boolean bool =false;
    int sum=0;
    int[]su=new int[100];
    int l=(int) Math.sqrt(input);  //求得输入数据的开根号值,并赋予l
    for(int m=2;m<=l;m++) {
        for(int n=2;n<=(int)Math.sqrt(m);n++) 
        {
            bool=false;
            if(m%n==0) {
                bool=true;
                break;
            }
        }
        if(bool==false) {
            su[m-2]=m;
            sum++;             //sum用于统计根号input以内素数的数目,用于下面for循环 
        }
    }
    int m=input/2;
    int[] a=new int[m+1];      //input/2=m,因此这个用于剔除倍数的数组下标定为m
    int[] b=new int[input-1];      //用于存储2-100

/*****************在数组b中存储0-input*************/
    System.out.print("2-"+input+"的原数组:");
    for(int i=0;i<b.length;i++) {
        b[i]=i+2;
        System.out.print(b[i]+" ");
    }
    System.out.print("\n");
/*****************将数组b中2、3、5......的倍数剔除*************/
    for(int q=0;q<sum;q++) {       //
    for(int j=2;j<m+1;j++) 
    {
        a[j]=su[q]*j;
        for(int i=0;i<b.length;i++) {
            if(a[j]==b[i])
            b[i]=0;
        }
        if(su[q]*j>input)break;    
    }
    }
/*****************显示input以内的素数*************/
    System.out.print(input+"以内的素数:");
    for(int i=0;i<b.length;i++) {
        if(b[i]!=0)
        System.out.print(b[i]+" ");
    }   
}
}


四、结果显示

在这里插入图片描述
注:

博主是新学JAVA的小白一枚,代码难免存在不足,欢迎各位高手批评指正并提出更高大上的求法哦。(* ̄(oo) ̄)


版权声明:本文为qq_37768971原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。