//传送门:水仙花数、完数、回文数、素数(数论基础集合)
一、最大公约数
(1)概念:最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有 约数中最大的一个。
(2)常见的方法: 质因数分解法、辗转相除法、 更相减损法 、短除法。
- 本文主要就质因数分解法,辗转相除法和更相减损法简单地展开讨论。
(3)解决方案
1.质因数分解法
这种方法的思路是将两个数分解为若干个质因数的乘积,通过比较以此求得最大公约数。
受此启发,我们求最大公约数最简单的方法就是让计算机一个一个地去试,暴力穷举。代码如下:
int gcd1(int a, int b)
{
a = abs(a);
b = abs(b);
int i;
if (a > b)
{
i = a;
a = b;
b = i;
}
for (i = a; i >= 1; i--)
{
if (b / a * a == b)
return a;
}
return 1;
}
2.辗转相除法
辗转相除法,又称欧几里得算法,是求最大公约数的一种算法。
算法描述:对于两个正整数m与n(m>n),它们的最大公约数等于m与n的余数 r 与n(较小的那个数)的最大公约数。
- 如:10 与 25
25 % 10 = 5
10 % 5 = 0
故 10 与 25 的最大公约数为5
基于这个算法原理,我们可以用循环或递归来求最大公约数,循环或递归的终止条件为余数为0。
int gcd2(int a, int b)
{
int t;
if (a < b)
{
t = a;
a = b;
b = t;
}
while (b != 0)
{
t = a % b;
a = b;
b = t;
}
return abs(a);
}
3.更相减损法
更相减损法,出自《九章算术》,也是一种求最大公约数的算法。
我们来看看百度百科上对这种算法的步骤描述:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。
- 如:45 与 27
45 - 27 = 18
27 - 18 = 9
18 - 9 = 9
9 - 9 = 0
因此45与27的最大公约数为9
与辗转相除法类似,也用到循环或递归,终止条件也是两个数相等。
int gcd3(int a, int b)
{
a = abs(a);
b = abs(b);
while (a != b)
{
if (a > b)
{
a = a - b;
}
else
{
b = b - a;
}
}
return a;
}
注:本文中用到的fabs()函数的作用为对整数取绝对值,在C语言中头文件为 stdlib.h,在C++中为 cmath。
二、最小公倍数
1.概念
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
2.方法
公式法:两个数的最小公倍数等于这两个数的乘积除与这两个数的最大公约数。
int hcf(int a, int b)
{
return a * b / gcd2(a, b);
}