当前位置:   article > 正文

质数的判定及筛选_质数的筛选

质数的筛选

我们都知道在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,也叫素数。

质数的判定:

我们一开始所选用的最原始的方法如下:

  1. boolean is_prime(int n){
  2. if(n<2) return false;
  3. for(int i=2;i<n;i++){
  4. if(n%i==0){
  5. return false;
  6. }
  7. }
  8. return true;
  9. }

这里补充一个新的判定方法——试除法

一个数的约数都是成对出现的,比如a和(n/a)。所以我们枚举较小的那个数就好。

依照a和(n/a),可以得到:a<=(n/a)==> a^2<=n ==> a<=n^(1/2)

  1. boolean is_prime(int n){
  2. if(n<2) return false;
  3. for(int i=2;i<=n/i;i++){
  4. if(n%i==0) return false;
  5. }
  6. return true;
  7. }

 第n个质数

我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……

请你计算第 2019 个质数是多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

利用质数的判定写出一个判断方法,利用该方法,返回true次数增加,直到次数==n得到所求值

  1. public class Main {
  2. public static void main(String[] args) {
  3. int i=2;
  4. int cnt=1;
  5. while (cnt<2019) {
  6. i++;
  7. if (isPrime(i)) {
  8. cnt++;
  9. }
  10. }
  11. System.out.println(i);
  12. }
  13. static boolean isPrime(int i) {
  14. for (int j = 2; j <=i/j; j++) {
  15. if (i%j==0) {
  16. return false;
  17. }
  18. }
  19. return true;
  20. }
  21. }

分解质因数

质因数就是一个数的约数,并且是质数。比如8=2×2×2,2就是8的质因数。12=2×2×3,2和3就是12的质因数。把一个式子以12=2×2×3的形式表示,叫做分解质因数。16=2×2×2×2,2就是16的质因数,把一个合数写成几个质数相乘的形式表示,这也是分解质因数。

要知道:一个数n中最多只包含一个大于n^(1/2)的质因子

可以反证:假设有两个大于n^(1/2)的质因子,两者相乘就大于n,不成立。

  1. void divide(int n){
  2. for(int i=2;i<=n/i;i++){
  3. if(n%i==0){
  4. int s=0;
  5. while(n%i==0){
  6. n/=i;
  7. s++;
  8. }
  9. System.out.println(i+" "+s);
  10. }
  11. }
  12. if(n>1){//剩下这个数就是大于n^(1/2)的唯一一个质因子
  13. System.out.println(n+" "+1);
  14. }
  15. }

质数的筛选方法

1、埃筛法(之前的笔记有写过这篇算是一个汇总吧)

2、线性筛

把每一个合数,用它的某一个质因子筛掉(n只会被最小质因子筛掉)

  1. void get_primes(){
  2. for(int i=2;i<=n;i++){
  3. if(!st[i]){
  4. primes[cnt++]=i;
  5. }
  6. for(int j=0;primes[j]<=n/i;j++){
  7. st[primes[j]*i]=true;
  8. if(i%primes[j]==0) break;//primes[j]一定是i的最小质因子
  9. }
  10. }
  11. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号