您的位置:首页 > 编程语言 > Java开发

求n以内的素数个数问题

2015-10-19 15:49 435 查看
首先约定n的范围,

1≤n≤10000000;

如何判断一个数m是否是素数,可以有很多种方法,最常见的方法就是
从1-根号m依次实验,然而这个方法的效率较慢,而且对于求n以内素数个数问题不适合。

新思路:
首先,如果2是素数的话,那么2的倍数一定不是素数。
同理,如果3是素数的话,那么3的倍数一定不是素数。
这样,我们就可以构建一个0-n的boolean数组,先初始化为false,然后从2进行判断,然后将2的倍数全部变为true,然后在判断3,依次类推。这样的效率约为0(n);

代码如下

static  boolean vis[]=new boolean[10000005];
public static void init()
{

    vis[1]=true;

    //首先全部初始化为false;
   
for(int i=2;i<=10000000;i++)

        vis[i]=false;

    //从2开始判断
   
for(int i=2;i<=10000000;i++)

    {

        //如果vis[i]==true,说明一定是数组之前某个元素的倍数,一定不是素数
       
if(vis[i]==false)

        {

            // 为false,表明是素数,将其倍数全部为true,这里倍数从2开始
           
for(int j=2;j*i<=10000000;j++)

                vis[j*i]=true;

        }

    }
}
这个代码效率较高,对于一个新的元素,直接查表即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java