【编程基础】009.输入两个正整数m和n,求其最大公约数和最小公倍数。

最大公约数与最小公倍数


题目描述

输入两个正整数m和n,求其最大公约数和最小公倍数。

输入格式

两个整数

输出格式

最大公约数,最小公倍数

样例输入

5 7

样例输出

1 35

题目思路

在这里我们用m表示较大的那个数,n表示较小的数。求最大公约数也即是求能被m和n 整除的最大数。gcd(m,n) 表示m 和n 的最大公约数。根据辗转相除法可知gcd(m,n)=gcd(n,m%n),具体证明过程如下:


gcd ⁡ ( m , n ) = gcd ⁡ ( n , m   m o d   n ) \operatorname{gcd}(m, n)=\operatorname{gcd}(n, m \bmod n) gcd(m,n)=gcd(n,mmodn) (不妨设 m > n m>n m>n r = m   m o d   n , r ≠ 0 r=m \bmod n, r \neq 0 r=mmodn,r=0 )

m m m 可以表示成 m = k n + r ( m , n , k , r m=k n+r(m, n, k, r m=kn+r(m,n,k,r 皆为正整数, 且 r < n ) r<n) r<n) ,则 r = m   m o d   n r=m \bmod n r=mmodn, 假设 d d d m , n m, n m,n 的一个公约数,即 m m m n n n 都可以被 d d d 整除。
r = m − k n r=m-k n r=mkn,两边同时除以 d d d ,可得:
r d = m d − k n d = h \frac{r}{d}=\frac{m}{d}-\frac{k n}{d}=h dr=dmdkn=h
由等式右边可知 h h h 为整数( d d d m m m n n n 的公约数, k n k n kn n n n 的整倍数,所以 k n d \frac{k n}{d} dkn 也应该是整数),所 以我们得出 d d d 也为 m m m n n n 的余数的公约数即 d d d n , m   m o d   n n , m \bmod n nmmodn 的公约数
至此,我们得知,如果一个数是两个数的公约数,那么,它也是这两个数的余数和较小数公约数。
假设 d d d ( n , m   m o d   n ) (n, m \bmod n) (n,mmodn) 的任意一个公约数,则 d d d n n n 的公约数, d d d ( m − k n ) (m-k n) (mkn) 的公约数, k k k 是一个整数,
我们假设 n = x d , m − k n = y d n=x d, m-k n=y d n=xd,mkn=yd 其中 x , y x, y x,y 是正整数,根据上面的推断可得:
m = y d + k n m=y d+k n m=yd+kn
两边同时除以 d d d ,得
m d = y + k n d \frac{m}{d}=y+\frac{k n}{d} dm=y+dkn
由已知可得 y y y 为正整数, d d d m m m 的公约数, k n d \frac{k n}{d} dkn 也肯定是正整数,故得 d d d m m m 的公约数.
因为 d d d 既是 n n n 的公约数又是 m m m 的公约数了,
所以证出 ( m , n ) (m, n) (m,n) ( n , m   m o d   n ) (n, m \bmod n) (n,mmodn) 的公约数是一样的,其最大公约数也必然相等。


所以求m和n的最大公约数,等价于求n 和m%n的最大公约数,用图来表示即不断地用n去填充 m表示的区域,接着赋值n=m%n,m=n 重复上述操作直到m%n==0,则n就是m和n的最大公约数。

在这里插入图片描述

AC代码(C语言)

#include<stdio.h>
int gcd(int m,int n){	
	int t;
	if(n>m){//令m>n
		t=n;
		n=m;
		m=t;
	}
	if(m%n==0) return n;
	return gcd(n,m%n);
}
int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	int gc=gcd(m,n);
	int cm=(m/gc)*(n/gc)*gc;
	printf("%d\n%d\n",gc,cm);
	return 0;
} 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩飞雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值