求素数算法

1. 最笨的方法:

   挨个循环用n除以2到n-1的所有整数,如果期间有一个能整除,那么n是合数(不是素数)。

 

2. 利用一个定理:

如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。

   反证法:

    设a = bq,因为a是合数,则b和q都是大于1的整数. 又设q是a的最小质因数,即b>=q.

  如果q<=根号a不成立,则必有 q>根号a,此时更有b > 根号a,于是a = bq> 根号a*根号a =  a ,出现矛盾,故q <=根号a     

 

证毕. 

 

 

 public static boolean isPrime(int n) {  
          for (int i = 2; i <= Math.sqrt(n); i++) {  
              if (n % i == 0) {  
                  return false;  
              }  
          }   
          return true;  
    }  

2. 筛选法求素数

      筛选法是效率最高的一种方法。首先建立一个布尔型1维数组a,长度为j-i,初始值为true。首先用第二种方法求得i、j之间的第一个质数m。求得m以后,将所有小于j的m的倍数所在的数组位置全部设为false。然后进行下一步,从n=m++开始,如果a[n-i]已经被设置为false,则n++,直到出现首个为true的位置p,再将所有小于j的p的倍数所在的数组位置置为false。继续下一步,直到n>根号j为止,这样所有为true的数组id(如果i=1则0除外,id从1开始)+i 即为质数。

    说的比较复杂,举个例子。例如要查找2-100之间的质数,首先2是质数,把2的倍数去掉(比如4,6,8,...,100,对应的数组位置是a[m-2]即a[2],a[4],a[6],...,a[98],将这些位置设为false);进行下一步,此时3没有被去掉(a[2]=true),可认为是质数,所以把3的倍数去掉(a[5]a[8]a[11],...,a[98]=false);再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数的最小质数因子肯定小于等于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。最后只要将a[id]中所有等于true的id值加上i输出即可。按照这个例子是id+2,比如0+2,1+2,3+2,...

     相对来说这种算法求1到n之间的质数实现起来比较简单,如果是求任意两个数之间的质数,逻辑上会比较复杂。但是,效率的确提高了很多很多。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值