对于素数的求法有很多的方法,本人在研究生面试的时候,被自己现在的导师问到了这个问题,写出一个实现100以内素数的小程序(语言不限), 当时自己用C语言写了一个很简单的。随后老师问到有没有改进的地方。自己冥思苦想,勉强又想了一个解决办法。
素数,相信大家都不陌生了,就是除了自己和1之外在没有其他的约数的自然数,方为素数。
老师最后的总结,这是一个很好的问题,考察你的编程思维到底如何。所以亲们,看到这个问题的时候,不妨自己先写写看,看自己能写出来几种。
下面给出了几种方法:
第一种:最最土的做法,也是自己当时写的第一种方法,大家瞟一眼就行,嘿嘿。。。
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
}
看完上面几种方法是不是有所想法啊!别闲着,有问题的咱们共同商量吧!嘿嘿!今天就先写到这里了!还有导师布置的任务没做呢!赶紧的吧.......