浅谈素数

素数:就是我们常说的质数,即只能被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]=true
		for(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;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值