求最大公约数
编程实现:从键盘输入两个自然数,找出这两个数的最大公约数并求出。
最大公因数:即两个数据中公共约数的最大者
方法:暴力穷举法、辗转相除法、更相减损法、stein算法.
方法一:暴力穷举法
穷举法:从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数表示最大公约数。
如果大数可以整除小数,那么最大公约数为小数。如果不能整除小数,那么着两个数就按大到小依次对比小数小的数求余,遇到都能够整除的,就是最大公约数。
![](https://i-blog.csdnimg.cn/blog_migrate/c2c46ae7fa5573dca108f83a8c43db25.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dfcd1d6bdf0ba8d8977cfa4d3bc0b758.png)
方法二:辗转相除法
辗转相除法:又称为欧几里得算法,采用函数嵌套调用形式进行求两个数的最大公约数。这一方法采用函数嵌套调用和递归调用形式进行求两个数的最大公约数和最小公倍数。
分析:从键盘输入两个自然数a和b,进行比较,使得a的值总是较小,b的值总是较大的,再使用辗转相除法求出两个数的最大公约数,然后输出即可。
思路:a=12 b=18 temp=a%b /* 计算a除以b的余数,
a=18 b=12 a等于b,b=余数temp*/
a=12 b=6 temp=a%b /*计算a除以b的余数,
a=6 b=2 temp=a%b a等于b,b=余数temp*/
a=2 b=0 /*b=0,计算结束*/
函数嵌套调用:
1.设两个数为a,b,设其中a做被除数,b做除数,temp为余数(a>b);
2.求a/b的余数,并将它放进temp中;
3.判断temp的值是否为零:若为零,则b就为a,b两个数的最大公约数,若不为零,将b赋值给a,temp的值赋给b,继续进行上步骤。
函数递归调用:
采用递归调用法要注意递归终止条件的描述,只有找到递归变化的规律,才能有效地解决问题。
方法三:更相减损法
第一步:任意给定两个正整数,判断它们是否都是偶数。若是,则用2约减。若不是,则执行第二步。
第二步:当两个数相等时,最大公约数为他们其中任意一个;当两个数不相等时,用大数减小数得到的差和之前的那个小数再次相减,直到两数相等。
第三步:第一步中约掉的若干个2的积与第二步中等数的乘积就是所求得最大公约数。或相等的两个数中,任意一个都是最大公约数。
方法四:Stein算法
- 两数均为偶数时将其同时除以2至少一数为奇数为止,记录除掉的所有公因数,记录除掉的所有公因数的乘积k。
2.如果任由一数为偶数,连续除以2直至该数为奇数为止。
3.用更相减损法(辗转相除法),即GCD(a,b)=GCD(a-b,b),或辗转相除法求出两奇数的最大公约数d.
4.原来两数的最大公约数即为d*k.