【第23题】给定a和b,求它们的最小公倍数

一、题目描述

循环输入。每组数据,给定两个非负整数 a a a b b b ( a , b ≤ 1 0 9 ) (a,b≤10^9) (ab109),求两者的最小公倍数。

二、解题思路

  • 根据算术基本定理,有如下的公式 : :
  • a = p 1 x 1 p 2 x 2 p 3 x 3 p 4 x 4 . . . p k x k a=p_1^{x_1}p_2^{x_2}p_3^{x_3}p_4^{x_4}...p_k^{x_k} a=p1x1p2x2p3x3p4x4...pkxk(1)
  • b = p 1 y 1 p 2 y 2 p 3 y 3 p 4 y 4 . . . p k y k b=p_1^{y_1}p_2^{y_2}p_3^{y_3}p_4^{y_4}...p_k^{y_k} b=p1y1p2y2p3y3p4y4...pkyk(2)
  • 那么最大公约数 g d c ( a , b ) gdc(a,b) gdc(a,b)和最小公倍数 l c m ( a , b ) lcm(a,b) lcm(a,b)可以表示成如下等式:
  • g c d ( a , b ) = p 1 m i n ( x 1 , y 1 ) p 2 m i n ( x 2 , y 2 ) p 3 m i n ( x 3 , y 3 ) . . . p k x k gcd(a,b)=p_1^{min(x_1,y_1)}p_2^{min(x_2,y_2)p_3^{min(x_3,y_3)}...p_k^{x_k}} gcd(a,b)=p1min(x1,y1)p2min(x2,y2)p3min(x3,y3)...pkxk
  • l c m ( a , b ) = p 1 m a x ( x 1 , y 1 ) p 2 m a x ( x 2 , y 2 ) p 3 m a x ( x 3 , y 3 ) . . . p k m a x ( x k , y k ) lcm(a,b)=p_1^{max(x_1,y_1)p_2^{max(x_2,y_2)}p_3^{max(x_3,y_3)}...p_k^{max(x_k,y_k)}} lcm(a,b)=p1max(x1,y1)p2max(x2,y2)p3max(x3,y3)...pkmax(xk,yk)
    -如果对这两个公式不懂,那么可以这么想 : : :
  • 最大公因数的话,比如说两个数字中都有一个相同的因子,但是他们次数不同,那么取较小次数的那个因子即可。如果相同,那么就取任意一个即可。如果两个因子不同,那么就将这两个因子乘起来。
  • 最小公倍数的话,比如说两个数字中都有一个相同的因子,但是他们次数不同,那么我们需要取到次数较大的那个因子。因为如果能够除掉那个次数较大的因子的话,较小的因子一定能被除掉。如果两个因子次数相同,那么任意取一个即可。如果两个因子不同的话,那么两个因子都取即可。
  • 我们现在将(1)(2)乘起来,那么相当于是 g c d ( a , b ) ∗ l c m ( a , b ) = a ∗ b gcd(a,b)*lcm(a,b)=a*b gcd(a,b)lcm(a,b)=ab(3)
  • 那么由此我们可以得到最小公倍数和最大公因数和 a , b a,b a,b的关系,即(3)式。

三、解题代码

#include <stdio.h>
int gcd(int num1, int num2)
{
	return !num2 ? num1 : gcd(num2,num1 % num2);
}

int main()
{
	int a, b;
	while(scanf("%d%d",&a,&b)!= EOF)
	{
		int g = gcd(a,b);
		printf("%d\n",a / g * b);//(1)
	}
	return 0;
}
  1. 注意先让 a / g a/g a/g,否则的话可能会发生溢出。

要是还不理解可以在文章下面评论留言或者私信作者。

四、写在最后

该文章内容是我阅读了CSDN博主英雄哪里出来的博文后,自己记录的一些观点和想法,希望对大家有帮助。英雄哪里出来的对应博文地址:传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值