最大公约数及最小公倍数

来源:互联网 发布:360卸载找不到软件 编辑:程序博客网 时间:2024/06/05 15:10

一. 题目

给定两个正整数 a, b ,求a和b的最大公约数及最小公倍数 .

二. 思路

1. 概念

最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。
两个或多个整数公有的倍数叫做它们的公倍数,两个或多个整数的公倍数里最小的那一个叫做它们的最小公倍数

2. 最大公约数

要求最大公约数,首先要知道两个古人研究出来的算法。
辗转相除法(欧几里德算法)
设两数为a, b(a > b), 求a和b最大公约数(a, b)的步骤如下:用a除以b, 得a ÷ b = q……r1(0 ≤ r1)。若r1 = 0, 则(a, b) = b;若r1 ≠ 0, 则再用b除以r1, 得b ÷ r1 = q……r2 (0 ≤ r2).若r2 = 0, 则(a, b) = r1, 若r2 ≠ 0, 则继续用r1除以r2, …… 如此下去,直到能整除为止。其最后一个余数为0的被除数的除数即为(a, b)的最大公约数
更相减损术
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,原文是:
“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
白话文译文:
(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分

所以,结合这两种方法,我们可以得到一个很简单的求最大公约数的方法。

  • 如果a, b都为偶数, 都除以2再求最大公约数, 得到的结果乘以2
  • 如果a, b只有一个为偶数, 因为另外一个数为奇数, 所以将偶数除以2再与奇数求最大公约数, 得到的结果不做其它操作
  • 如果a, b都为奇数, 求a, b的最大公约数就想当于求a, b中大数与小数之差和小数的最大公约数

3. 最小公倍数

设两个数为 x 和 y, 其最大公约数为 a, 则
最小公倍数为 (x / a) * (y / a)* a = xy / a;
最大公约数和最小公倍数的乘积为 xy / a* a = xy
两个正整数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积

三 .实现

//最大公约数int gcd(int a, int b){    if(a == b)        return a;    if(a < b)        return gcd(b, a);    if(a % 2 == 0 && b % 2 == 0)        return gcd(a >> 1, b >> 1) << 1;    if(a % 2 == 0 && b % 2 == 1)        return gcd(a >> 1, b);    if(a % 2 == 1 && b % 2 == 0)        return gcd(a, b >> 1);    return gcd(a - b, b);}//最小公倍数int lcm(int a, int b){    return a * b / gcd(a, b);}
原创粉丝点击