mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数学类算法题总结

质数

什么是质数?质数是从2开始,因子只有1和本身。

1.判断质数

public boolean isPrime(int num) {
    if (num < 2) return false;
    boolean flag = true;
    for (int i = 2;i <= num / i;i++) {	//对称性,减少循环次数。如3 * 5 == 5 * 3
        if (num % i == 0) flag = false;
    }
    return flag;
}

基于基本算数定理,任何一个数都可以被分解质因数。形如: a = a1^b1 * a2^b2...其中底数都是质数,指数任意。

2.分解质因数(将分解的结果打印出来)

/*
	如何实现?从小到大枚举底数(质数)
	一个结论:从2开始枚举,若该数字为因子,则必为质因子
*/
public void getAns(int num) {
    for (int i = 2;i <= num/i;i++) {
        if (num % i == 0) {
            int b = 0;
            while (num % i == 0) {
                b++;
                num /= i;
            }
            System.out.print(i+" "+b);
        }
    }
    if (num > 1) System.out.println(num+" "+1);//大因子
}

给一堆数,如何把质数筛选出来

3.筛质数

import java.util.*;

public class Main {
    static int N = 1000010;
    static boolean[] flag = new boolean[N];//筛子
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        for (int i = 2; i <= n; i++) {//从小到大遍历质数,其倍数必定不是倍数,会被筛掉
            if (!flag[i]) {
                count++;
            }
            for (int j = i;j <= n;j += i) {//从小到大筛掉非质数,可能会多次筛同一个数
                flag[j] = true;
            }
        }
       System.out.println(count);
    }
}

约数

1.给一个数,从小到大输出它的约数

/*
	试除法求约数
*/
static List getAns(int num) {
    List<Integer> list = new ArrayList();
    for (int i = 1;i <= num/i;i++) {	//这一步大大减少了时间复杂度 由 n --> 根号n
        if (num % i == 0) {
            list.add(i);
            if (num/i != i) {
                list.add(num / i);
            }
        }
    }
    Collections.sort(list);
    return list;
}

2.给你一堆数,求其乘积后约数的个数

/*
	结论:求某个数的约数个数  ===  分解质因数后,所有指数加一的乘积	随便举例:75 = 3^1 * 5^5  因数个数 (1+1)*(5+1)=6
*/
import java.util.*;

public class Main {
    static Map<Integer,Integer> map = new HashMap();
    static double MOD = 1e9 + 7; 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ans = 1;
        while (n-- > 0) {
            int m = sc.nextInt();
            getAns(m);
        }
        for (int i:map.values()) {
            ans = (ans * (i + 1)) % (int)MOD;
        }
        System.out.println(ans);
    }
    
    static void getAns(int num) {
        for (int i = 2;i <= num/i;i++) {
            if (num % i == 0) {
                int b = 0;
                while (num % i == 0) {
                    b++;
                    num /= i;
                }
                if (map.containsKey(i)) { //这个containsKey()方法常用,常使用于统计
                    map.put(i,map.get(i) + b);
                }else {
                    map.put(i,b);
                }
            }
        }
        if (num > 1) {
            if (map.containsKey(num)) {
                    map.put(num,map.get(num) + 1);
                }else {
                    map.put(num,1);
                }
        }
    }
}	

欧拉函数

快速幂

扩展欧利几得算法

中国剩余定理

求组合数

容斥定理

博弈论

posted on 2022-05-16 17:08  万能包哥  阅读(52)  评论(0编辑  收藏  举报