一、说明
文章用于个人学习C++代码编写使用,前期只会简单的将代码粘贴上来,没时间整体说明。
后续会慢慢完善文章体系。
所有文章会放置在《C++代码编程》栏目里
所有的题目均来源于C语言网
ps:所有代码都是自己编写实现并通过的,可能不是最优解,后续会编写相应的最优解在文章后面
二、题目
题目描述
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入格式
两个整数
输出格式
最大公约数,最小公倍数
样例输入
5 7
样例输出
1 35
三、解题思路
思路:看到求最大公约数第一反应是使用辗转相除法,也称欧几里得算法。
辗转相除法:使用较大的数 / 较小的数,如果余数为0,则较小的那个数就是最大公约数。
否则,继续使用较小的数 / 余数,直到最后余数为0的时候,此刻的除数就为最大公约数。
例:7 / 5 ...... 2 -----> 5 / 2 ...... 1 -----> 2 / 1 ...... 0 则最大公约数为1
当看到求最小公倍数的时候想到可以利用最大公约数进行求:两数之积 / 最大公约数 = 最小公倍数
当然,此题因为编写代码整洁方便,故使用了定义函数的方法进行,同样可以使用循环的方式实现,跟求第n年共有多少母牛那道递归题类似。
四、代码实现
#include<iostream>
using namespace std;
int gcd(int m, int n){ //定义辗转相除法函数
if(n == 0) //当余数为0时,即为最大公约数
return m;
else
return gcd(n,m%n); //使用除数和余数继续进行辗转相除。
}
int lcm(int m, int n){ //定义求最小公倍数函数
return (m * n) / gcd(m,n); //最小公倍数求法:使用两个数的乘积除以最大公约数
}
int main()
{
int m,n;
cin >> m >>n;
if(m > n){ //使用辗转相除法需要确保被除数比除数大
cout << gcd(m,n) << " " << lcm(m,n);
}
else
cout << gcd(n,m) << " " << lcm(n,m);
}