数学知识----质数

简介: 数学知识----质数

质数

质数是针对于大于1的自然数定义的,小于等于1的数既不是质数也不是合数

质数:

在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数

试除法判定质数

朴素做法:

package luogu.数学知识.质数;
import java.util.Scanner;
public class 质数的判定_试除法 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println( is_prime(n) );
    }
    static boolean is_prime( int n ) {
        if ( n<2 ) return false;
        for ( int i=2; i<n; i++ ) {
            if ( n%i==0 ) return false;
        }
        return true;
    }
}

优化:

package luogu.数学知识.质数;
import java.util.Scanner;
public class 质数的判定_试除法 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println( is_prime(n) );
    }
    static boolean is_prime( int n ) {
        if ( n<2 ) return false;
        //不写成 i*i<=n 如果i过大,那么会存在溢出的可能
        //也不写成sqrt 速度较慢
        for ( int i=2; i<=n/i; i++ ) {
            if ( n%i==0 ) return false;
        }
        return true;
    }
}

分解质因数

package luogu.数学知识.质数;
import java.util.Scanner;
public class 分解质因数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        divide(n);
    }
    static void divide( int n ) {
        for ( int i=2; i<=n; i++ ) {
            if ( n%i==0 ) {
                int s = 0;
                while ( n%i==0 ) {
                    n /= i;
                    s++;
                }
                System.out.println(i+" "+s);
            }
        }
    }
}

优化:

n中最多只有一个大于sqrt(n)的质因子,因为如果有两个相乘会大于n

package luogu.数学知识.质数;
import java.util.Scanner;
public class 分解质因数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        divide(n);
    }
    static void divide( int n ) {
        for ( int i=2; i<=n/i; i++ ) {
            if ( n%i==0 ) { //i一定为质数
                //不为质数的数为某个质数的倍数,该个质数已经被除完
                int s = 0;
                while ( n%i==0 ) {
                    n /= i;
                    s++;
                }
                System.out.println(i+" "+s);
            }
        }
        if ( n>1 ) System.out.println(n+" "+1);
    }
}

筛素数

一个数不是质数,这个数的倍数也不为质数

一个数为质数,这个数的倍数不为质数

package luogu.数学知识.质数;
import java.util.ArrayList;
import java.util.Scanner;
public class 筛素数 {
    static ArrayList<Integer> prime = new ArrayList<>();
    static boolean[] nums = null;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        nums = new boolean[n+1];
        getPrime(n);
        System.out.println(prime.toString());
    }
    static void getPrime( int n ) {
        for ( int i=2; i<=n; i++ ) {
            //为素数
            //去除素数的倍数
            if ( !nums[i] ) {
                prime.add(i);
            }
            //去除倍数
            for ( int j=i+i; j<=n; j+=i ) {
                nums[j] = true;
            }
        }
    }
}

优化–埃氏筛法

package luogu.数学知识.质数;
import java.util.ArrayList;
import java.util.Scanner;
public class 筛素数 {
    static ArrayList<Integer> prime = new ArrayList<>();
    static boolean[] nums = null;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        nums = new boolean[n+1];
        getPrime(n);
        System.out.println(prime.toString());
    }
    static void getPrime( int n ) {
        for ( int i=2; i<=n; i++ ) {
            //为素数
            //去除素数的倍数
            if ( !nums[i] ) {
                prime.add(i);
                //去除倍数
                for ( int j=i+i; j<=n; j+=i ) {
                    nums[j] = true;
                }
            }
        }
    }
}

线性筛法

package luogu.数学知识.质数;
import java.util.ArrayList;
import java.util.Scanner;
public class 筛素数 {
    static ArrayList<Integer> prime = new ArrayList<>();
    static boolean[] nums = null;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        nums = new boolean[n+1];
        getPrime(n);
        System.out.println(prime.toString());
    }
    static void getPrime( int n ) {
        for ( int i=2; i<=n; i++ ) {
            //为素数
            //去除素数的倍数
            if ( !nums[i] ) {
                prime.add(i);
            }
            for ( int j=0; prime.get(j)<=n/i; j++ ) {
                nums[prime.get(j)*i] = true;
                if ( i%prime.get(j)==0 ) break;
            }
        }
    }
}

每次循环,遍历一次素数,除去素数对应的倍数


相关文章
|
2天前
|
存储 算法
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
34 1
|
2天前
|
算法
【动态规划专栏】专题一:斐波那契数列模型--------3.最小花费爬楼梯
【动态规划专栏】专题一:斐波那契数列模型--------3.最小花费爬楼梯
37 2
|
机器学习/深度学习 人工智能
数学知识-质数
数学知识-质数
|
人工智能
求解最大公约数----最小公倍数
最大公因数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。最小公倍数的计算要把三个数的公有质因数和独有质因数都要找全,最后除到两两互质为止。
51 0
|
算法
基础算法练习200题16、打印质数
基础算法练习200题16、打印质数
68 0
基础算法练习200题16、打印质数
|
算法
动态规划---数字三角形模型(一)
AcWing算法提高课内容,本文讲解 动态规划
96 0
动态规划---数字三角形模型(一)
|
算法
动态规划---数字三角形模型(二)
AcWing算法提高课内容,本文讲解 动态规划
77 0
动态规划---数字三角形模型(二)
|
算法
数学知识:质数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:质数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
112 0
数学知识:质数(一)