数学类算法题总结
质数
什么是质数?质数是从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);
}
}
}
}
欧拉函数
快速幂
扩展欧利几得算法
中国剩余定理
求组合数
容斥定理
博弈论
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |