求最大公约数和最小公倍数
两个自然数的积等于这两个数的最大公约数与最小公倍数的积。
求最大公约数的方法:
1、辗转相除法:
辗转相除法又称为欧几里德算法其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
当b==0时,gcd(a,b)中的a即为最大公约数;
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a(整除),d|b,而r = a - kb,因此d|r
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
举例:求(377,319)的最大公约数
∵ 377÷319=1(余58) ∴(377,319)=(319,58);
∵ 319÷58=5(余29),∴ (319,58)=(58,29);
∵ 58÷29=2(余0), ∴ (58,29)= 29;
∴ (319,377)=29.
代码:
- 递归算法:
- int gcd(int a,int b)//(要保证a不小于b)
- {
- if(y==0) return a;
- else return gcd(b,a%b);
- }
- 非递归算法:
- int gcd(int a,int b)//(保证a不小于b)
- {
- int MOD;
- do
- {
- MOD=x%y;
- a=b;
- b=MOD;
- }while(MOD!=0);
- return a;
- }
2、更相减损法:
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法
举例:用更相减损术求260和104的最大公约数。
解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。
此时65是奇数而26不是奇数,故把65和26辗转相减:
65-26=39
39-26=13
26-13=13
所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13*2*2=52。
先用2进行约束是为了提高计算的速度,也可以用下面的过程计算(省去第一步):
260-104=156;
154-104=52;
104-52=52;
所以52是两者的最大公约数;
代码:
- int gcd(int a,int b)
- {
- while(a!=b)
- {
- if (a>b)
- a-=b;
- else
- b-=a;
- }
- return a;
- }
3、在解有关最大公约数、最小公倍数的问题时,常用到以下结论:
(1)如果两个自然数是互质数,那么它们的最大公约数是1,最小公倍数是这两个数的乘积。
例如8和9,它们是互质数,所以(8,9)=1,[8,9]=72。
(2)如果两个自然数中,较大数是较小数的倍数,那么较小数就是这两个数的最大公约数,较大数就是这两个数的最小公倍数。
例如18与3,18÷3=6,所以(18,3)=3,[18,3]=18。
(3)两个整数分别除以它们的最大公约数,所得的商是互质数。
例如8和14分别除以它们的最大公约数2,所得的商分别为4和7,那么4和7是互质数。
(4)两个自然数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积。
例如12和16,(12,16)=4,[12,16]=48,有4×48=12×16,即(12,16)× [12,16]=12×16。
Coding Your Life