求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;
}
}
}
这个代码效率较高,对于一个新的元素,直接查表即可。
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统