数学知识----质数

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

质数

质数是针对于大于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;
            }
        }
    }
}

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


相关文章
|
6月前
|
算法
算法每日一题---两数之和
算法每日一题---两数之和
29 0
|
机器学习/深度学习 人工智能
数学知识-质数
数学知识-质数
|
人工智能
求解最大公约数----最小公倍数
最大公因数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。最小公倍数的计算要把三个数的公有质因数和独有质因数都要找全,最后除到两两互质为止。
78 0
|
算法
基础算法练习200题16、打印质数
基础算法练习200题16、打印质数
84 0
基础算法练习200题16、打印质数
|
机器学习/深度学习 算法 C++
算法基础系列第四章——数论之质数与约数(1)
算法基础系列第四章——数论之质数与约数(1)
181 0
算法基础系列第四章——数论之质数与约数(1)
|
算法 C++
算法基础系列第四章——数论之质数与约数(2)
算法基础系列第四章——数论之质数与约数(2)
119 0
算法基础系列第四章——数论之质数与约数(2)
|
算法
数学知识:质数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:质数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
149 0
数学知识:质数(一)
三个袋子----数论推导
题目描述 平平在公园里游玩时捡到了很多小球,而且每个球都不一样。平平找遍了全身只发现了3个一模一样的袋子。他打算把这些小球都装进袋子里(袋子可以为空)。他想知道他总共有多少种放法。 将N个不同的球放到3个相同的袋子里,求放球的方案总数M。 结果可能很大,我们仅要求输出M mod K的结果。 现在,平平已经统计出了N<=10的所有情况。
113 0
三个袋子----数论推导