题目标题:最大公约数和最小公倍数 题目作者:张彤彧 浙江大学
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
思路:求最大公约数的方法,目前来说最好的就是辗转相除法,也叫欧几里得算法(Euclidean Algorithm)。
例如,要计算15和24的最大公约数,首先让把较大的数赋值给p,把较小的数赋值给q,p=24,q=15;
然后计算p,q的余数,即r=p%q,显然如果r==0了,q就能整除p,从而最大公约数就是q。如果r!=0,那么可以推导出p,q的最大公因子一定等于q,r的最大公因子。
于是更新p=q,q=r, 并重复上面的步骤,直到r==0为止,这时的q就是,原p,q的最大公因子。
注意:如果p,q中有一个数是0,那么GCD(p,q)就是p,q中另一个非0的数。当然本题明确说输出都是正整数,所以不用考虑这种情况。
至于最小公倍数,它显然就是两数乘机除以最大公约数。根据上面的分析,我们先给出两个基本的写法,即代码1和代码2。
代码1:
#include <stdio.h>
int main () {
int M,N,p,q,r;
scanf("%d %d", &M, &N);
p = M>N? M:N; // p是较大的
q = M>N? N:M; // q是较小的
r = p%
欧几里得算法实现:最大公约数与最小公倍数,

本文介绍了使用辗转相除法(欧几里得算法)计算两个正整数最大公约数(GCD)和最小公倍数(LCM)的方法,并给出了C++代码示例。算法的核心是不断用较大数除以较小数的余数,直到余数为0,此时较小数即为最大公约数,而两数乘积除以最大公约数即为最小公倍数。
最低0.47元/天 解锁文章
6396

被折叠的 条评论
为什么被折叠?



