解决数学问题算法简略记录
1、公倍数与公因数
辗转相除法
- 很方便的求得最大公因数(Greatest Common Divisor, GCD)
- 两个数相乘再除以最大公因数得到最小公倍数(Least Common Multiple, LCM)
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a%b);
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
扩展欧几里得算法
- 在求得a和b最大公因数的同时,得到其系数x和y,使得
ax + by = gcd(a, b)
Int y=new Int();
Int x=new Int();
int exgcd(int a,int b,Int x,Int y) {
if(b==0) {
x.v=1;
y.v=0;
return a;
}
int gcd=exgcd(b, a%b, x, y);
int c=y.v;
y.v=x.v-(a/b)*y.v;
x.v=c;
return gcd;
}
class Int{
int v;
public Int() {
};
public Int(int v) {
this.v=v;
}
2、质数
- 质数(素数),大于1的自然数中,除了1和其本身以外不再有其他因素的自然数
- 所有自然数都可以分解成质数的乘积
解题思路
- 埃拉托斯特尼筛选法,判断一个整数是否是质数
- 该题:从1到n开始遍历,假设当前遍历到m,则把小于n且是m的倍数的整数标为和数;遍历完成后,没有被标记的数字为质数
Java解答
class Solution {
public int countPrimes(int n) {
boolean[] notPrimes = new boolean[n];
int count = 0;
int sqrt_n = (int)Math.sqrt(n);
if(n > 2)
count ++;
for (int i = 3; i < n; i += 2) {
//如果是合数就不需要统计
if