“素数”的几种求法的实现与比较

素数,相信大家都不陌生了,就是除了自己和1之外在没有其他的约数的自然数,方为素数。微笑

对于素数的求法有很多的方法,本人在研究生面试的时候,被自己现在的导师问到了这个问题,写出一个实现100以内素数的小程序(语言不限), 当时自己用C语言写了一个很简单的。随后老师问到有没有改进的地方。自己冥思苦想,勉强又想了一个解决办法。

老师最后的总结,这是一个很好的问题,考察你的编程思维到底如何。所以亲们,看到这个问题的时候,不妨自己先写写看,看自己能写出来几种。

下面给出了几种方法:

第一种:最最土的做法,也是自己当时写的第一种方法,大家瞟一眼就行,嘿嘿。。。

public static void main(String[] args) {
		long startT=new Date().getTime();
		int num=100000;
		boolean sFlag=false;
		for(int i=1;i<num;i++){
			sFlag=false;
			for(int j=2;j<num;j++){
				if(i%j==0){
					sFlag=true;
				}	
			}
			if(!sFlag){
				System.out.println("   "+i);
			}
		}
		long endT=new Date().getTime();
		System.out.println("所用时间:::"+(endT-startT)+"ms");//42646ms
	}

  此做法:在num值小的时候,没什么大的影响,当num很大的时候,就会出现效率很低的情况,比如当num=100000时,运行时间为:42646ms(本人笔记本测定),将上面的改为i/2后,当num=100000时,运行时间为:56697ms Oh myladygaga!


看下面这个做法:

public static void main(String[] args) {
		long startT=new Date().getTime();
		int num=100000;
		for(int i=1;i<=num;i++){
			for(int j=2;j<i;j++){
				if(i%j==0) break;
				if(j>=i-1)
				System.out.println(i);
			}
		}
		long endT=new Date().getTime();
		System.out.println("所用时间:::"+(endT-startT)+"ms");//3960ms
	}

      此种做法: 当num=100000时,运行时间为:3960ms(本人笔记本测定)    
总结:这里两种方法实现起来很简单,但是想必大家也能发现其中的问题,如果num这个数值很大的时候就会出现效率很低的情况,所以有没有更好的方法呢!?嘿嘿,耐心的看下面的方法哦!


第二种:此做法,有长进哦!就是将参数i改为sqrt(i);

public static void main(String[] args) {
		long startT=new Date().getTime();
		int num=100000;
		boolean sFlag=false;
		for(int i=1;i<num;i++){
			sFlag=false;
			int k=(int)Math.sqrt((double)(i));
			for(int j=2;j<k;j++){
				if(i%j==0){
					sFlag=true;
				}	
			}
			if(!sFlag){
				System.out.println("   "+i);
			}
		}
		long endT=new Date().getTime();
		System.out.println("所用时间:::"+(endT-startT)+"ms");//473ms
	}


  这种做法很明显:速度快了很多!就是将循环的参数改为num的算术平方根,减少了循环的次数。但是这些方法都还不是最理想的,下面一个是根据筛选法进行的一个求素数的方法。

第三种方法:埃拉托斯特尼筛法求素数

具体的文章,大家参考维基百科:http://zh.wikipedia.org/wiki/%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF%E7%89%B9%E5%B0%BC%E7%AD%9B%E6%B3%95(埃拉托斯特尼筛法)

public static void main(String[] args) {
		long startT=new Date().getTime();
		int num=100000;
		boolean [] hash=new boolean[num];
		
		for(int i=2;i<num;i++){//此处注意:i是从2开始
			if(!hash[i]){
				for(int j=i<<1;j<num;j+=i){
					if(!hash[j]){
						hash[j]=true;
					}
				}
			}
		}
		
		for(int k=1;k<num;k++){
			if(!hash[k]){
				System.out.println(k);
			}
		}
		long endT=new Date().getTime();
		System.out.println("所用时间:::"+(endT-startT)+"ms");//运行时长:122ms
	}

看完上面几种方法是不是有所想法啊!别闲着,有问题的咱们共同商量吧!嘿嘿!今天就先写到这里了!还有导师布置的任务没做呢!赶紧的吧.......

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值