本篇博客主要介绍最大公约数及其求解方法。
最大公约数
首先,最大公约数是什么?
按照定义,最大公约数是两个数的公共因子中最大的一个。所以两个数最大公因数一定是确定的,同时最大公因数只能对于两个以上的数存在。
求解
1.枚举因数
按照定义,我们可以知道,两个数的最大公因数一定是这两个数的公因数,所以很容易想到,当我们将每一个公因子求出来时,其中的最大因子一定是最大公因数。
由此可以得到一个朴素算法:对于 n n n, m m m两个数,枚举小于等于 n \sqrt{n} n的每一个数,当这个数是 n n n的因子时,判断这个数是不是 m m m的因子,如果是,那么记录该数,并判断它是否是已经找到的数中的最大值。
当然,可以选择性地只枚举小于等于 min ( n , m ) \sqrt{\min(n , m)} min(n,m)的数,但是实际优化程度不大,仅在 n , m n , m n,m相差较大时才有明显效果。
int gcd(int n, int m)
{
int maxn = 1;
for(int i=2; i<sqrt(n)/*sqrt(min(n , m))*/; i++)
{
if(n%i==0)
{
if(m%i==0)
{
if(maxn < i)
maxn = i;
}
}
}
return maxn;
}
2.构造
上述方法明显多扫描了许多数字,所以我们可以考虑构造最大公因数。
既然最大公因数是两数的最大的公因数,那么最大公因数一定包含两数所有的公共质因子