浅谈素数

来源:互联网 发布: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;}


原创粉丝点击