思路:
我们拿到一个问题首先要做的是理清思路,对于数学问题来说,我们一般是先用数学的思维来思考如何解决这个问题,然后再把它转化成为计算机语言
如何求最大公约数
那么如何求最大公约数呢?如果这是一个小学数学题,我们可能会去拼凑,也就是我们常说的穷举法。“正规一点”的我们会用非常耳熟的辗转相除法(也就是欧几里得算法),我也暂时只介绍这一种方法,能够将他写好写熟练就非常不错了,其他的方法可以自己研究一下。
辗转相除法
说到辗转相除法,大家估计是又熟悉又陌生,那么我就不卖关子了,开剖吧!
首先呢,我们要相除,就得有两个数 ,假设为32和12
然后,根据32/12=2……8,得到32除以12的余数为8
接着,再将开始的两个数中较小的数12和第一次取余的余数8放在一起
继续进行取余的操作,即12/8=1……4,得到12处于8的余数为4
同样的,将8和4放在一起
然后继续取余,8/4=2……0,此时取余已经为0了,表明辗转相除法已经到头了。(辗转辗转,就是这样一步一步搞下来的)
相信举实数的例子看起来更容易理解他的操作步骤,不像直接看代码或者用字母替代的步骤那样难嚼,不过接下来再用“官方”一点的语言描述一下这个过程,相信你们就能看懂了。
设两数为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,
如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。1
如何求最小公倍数
求最小公倍数可以借助最大公约数,因为最小公倍数=两数之积除以最大公约数
如此一来,求最小公倍数就显得如此简单,可以先求出最大公约数,再拿两数之积除以它便能得到最小公倍数了!
代码:
#include <iostream>
using namespace std;
int gcd(int,int); //调用最大公约数的函数声明
int lcm(int,int); //调用最小公倍数的函数声明
int main(){
int num1,num2,g,l;
cout << "请输入两个数:";
cin >> num1 >> num2;
cout << "你输入的两个数为:" << num1 << " " << num2 << endl; // 测试,此行可省略
g = gcd(num1, num2); //传参求值
l = lcm(num1, num2); //传参求值
cout << "他们的最大公约数是:" << g << endl; //输出结果
cout << "他们的最小公倍数是:" << l << endl; //输出结果
return 0;
}
int gcd(int x,int y){
int temp,a;
// 保证x<y
if(x<y){
temp = x;
x = y;
y = temp;
} //其实这里可以稍作改进,不用提前将他们按照顺序排列,评论区可以讨论一下
while(y!=0){
a = x % y;
x = y;
y = a;
}
return x; //返回x给main函数中的g
}
int lcm(int m,int n){
int g1,b;
g1 = gcd(m,n); //调用求最大公约数的函数
b = (m*n) / g1; //最小公倍数=两数之积/最大公约数
return b; //返回b给main函数中的l
}