方法有很多(各有各的优点) 静下心看
第一种 穷举法
解释:如果两个数能够整除 则最大公因数是那个小的数 例如 20和5 20/5==4 则最大公因数为5
若不能整除 则最大公因数是 比小数小的(肯定是在小数上找) 且能被两个数整除的
int xxx(int a, int b) //定义找最大公因数的函数
{
int i;
int min = a < b ? a : b; //在小数上找
for (i = min; i >= 1; i--) //先从小数的最大值开始 因为是最大公因数
{
if (a % i == 0 && b % i == 0) //被两个数同时整除
}
return i; //返回i的值
}
第二种 质数分解法
将所有的公有小公因数相乘 就是 最大公因数
- 求 20和 40 的最大公因数。
- 先对 20 进行质因数分解:20=2*2*5
- 再对 40进行质因数分解:40=2*2*2*5
- 公有的质因数是 2 和 5,其中 2 出现两次,5 出现一次,所以最大公因数为2*2*5=20
- 代码实现 还不能理解的可以带入是数据验证 这样好理解
-
int xxx(int a, int b) //定义函数 { int result = 1; //定义一个存放结果的变量 for (int i = 2; i <= a && i <= b; i++) 也能从 1开始 不过从1开始的话结果不变 反而增加计算量 { while (a % i == 0 && b % i == 0) //直到找到公因数 { result *= i; a /= i; b /= i; i = 1; //找到之后 又从1开始找 } } return result; //返回 }
第三种 辗转相除法
-
辗转相除法,又称欧几里得算法,其基本原理是:用较大数除以较小数得到商和余数,再用除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公因数。
-
// 函数用于求两个数的最大公因数,使用辗转相除法 int xxx(int a, int b) { int temp; while (b!= 0) { temp = b; b = a % b; a = temp; } return a; }
第四种 更相减损术
-
更相减损术的原理是:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止,此时这个相等的数就是最大公因数。
// 函数用于求两个数的最大公因数,使用更相减损术 int xxx(int a, int b) { while (a!= b) { if (a > b) { a = a - b; } else { b = b - a; } } return a; }