浅谈素数
来源:互联网 发布:mr.lemon知乎 编辑:程序博客网 时间:2024/06/03 12:56
素数:就是我们常说的质数,即只能被1和它自己本身所整除的数(当然都是在自然数的范围内考虑的)。
下面介绍几种求N以内素数的算法。
1.从1-N全部去遍历,当这个数只能满足被1和n整除它就是素数。
public static int[] prime1 (int n){int [] a = new int[100];int num = 0;int j=0;for(int i=1;i<=n;i++){for(j=2;j<i;j++){if(i%j==0){break;}}if(j==i){a[num] = i;num++;}}return a;}
2.有人发现,根本不用遍历到N-1,只需遍历到N的平方根就能判断这个数是不是素数了。代码就略了,基本和1是一样的。
3.用筛数法求素数
用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
public static int[] prime2(int n){//筛选10000以内的素数 //定义arr数组来表示筛选出来的素数boolean arr[] = new boolean[n];int [] a = new int[100];int num = 0;//arr数组坐标i不是素数的话就令arr[i]=truefor(int k=2;k<n;k++){if(!arr[k]){for(int i=2*k;i<n;i+=k){arr[i] =true;}}}//把求的素数放入数组a中。for(int i=1;i<n;i++){if(!arr[i]){a[num] = i;num++;}}return a;}
4.用6N±1法求素数
任何一个自然数,总可以表示成为如下的形式之一:
6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)
显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。
根据上述分析,我们可以构造另一面筛子,只对形如6 N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。
以下代码需要自然数大于10 。
public static int[] prime3(int n){int []a = new int[100];int k=0;int num = 5;a[0]=1;a[1]=2;a[2]=3;a[3]=5;a[4]=7;for(int i=3;i<n;i+=3){for(int j=0;j<2;j++){k = 2*(i+j)-1;if((k<n)&&k%5==0?false:k%7==0?false:true){a[num] = k;num++;}}}return a;}
- 浅谈素数
- 浅谈素数
- 浅谈素数
- 浅谈反素数
- 浅谈求素数的方法
- 浅谈—线性筛选素数
- 浅谈基于随机性算法的素数判定
- 浅谈数论(二)进阶素数筛法
- BZOJ 1053 浅谈正统素数的侧面反素数A.N.T.
- 素数
- 素数
- 素数
- 素数
- 素数
- 素数
- 素数
- 素数
- 素数
- 英语汉语对比学习:动词(二) 动词变形
- SQL Server2005或以上使用XML片段
- Linux下实现c语言hello world 步骤
- Invalid byte 2 of 2-byte UTF-8 sequence
- Android开发笔记--Dialog提示框
- 浅谈素数
- linux 打包命令
- Cygwin设置字体
- 突破社区版 Hadoop各商业发行版比较
- Android Json数据解析
- webkit html 解析流程
- 何必伤情的伤感QQ心情日志发布:爱情,至少我挽留过
- YUV格式详解
- 如何使进程运行在后台